Подтвердить что ты не робот

Получить последнее поле с использованием awk substr

У меня есть простое требование: Я получаю имена файлов с абсолютным каталогом.
Например /home/parent/child/filename
Мое требование - вырезать имя файла из этого. Я пробовал:

awk -F "/" '{print $5}' input

который отлично работает.
Но здесь есть жесткое кодирование $5, которое может отличаться, если мой ввод имеет структуру следующим образом:

/home/parent/child1/child2/filename

Поэтому он должен быть динамическим без жесткого кодирования. Вот логика:
Всегда берете последнее поле, которое будет именем файла (так что нужно проверить с реверса).

Может ли кто-нибудь помочь мне с помощью функции awk substr или любой другой функции?

4b9b3361

Ответ 1

Используйте тот факт, что awk разделяет строки в полях на основе разделителя полей, которые вы можете определить. Следовательно, определяя разделитель полей на /, вы можете сказать:

awk -F "/" '{print $NF}' input

as NF относится к числу полей текущей записи, печать $NF означает печать последнего.

Итак, задайте такой файл:

/home/parent/child1/child2/child3/filename
/home/parent/child1/child2/filename
/home/parent/child1/filename

Это будет выход:

$ awk -F"/" '{print $NF}' file
filename
filename
filename

Ответ 2

В этом случае лучше использовать basename вместо awk:

 $ basename /home/parent/child1/child2/filename
 filename

Ответ 3

Если вы открыты для решения Perl, здесь одно похожее на решение fedorqui awk:

perl -F/ -lane 'print $F[-1]' input

-F/ указывает / как разделитель полей
$F[-1] - последний элемент в массиве autosplit @F

Ответ 4

Другим вариантом является использование bash подстановка параметров.

$ foo="/home/parent/child/filename"
$ echo ${foo##*/}
filename
$ foo="/home/parent/child/child2/filename"
$ echo ${foo##*/}
filename

Ответ 5

Он должен быть комментарием к ответу на basename, но у меня недостаточно очков.

Если вы не используете двойные кавычки, basename не будет работать с путем, где есть пробел:

$ basename /home/foo/bar foo/bar.png
bar

ok с кавычками ""

$ basename "/home/foo/bar foo/bar.png"
bar.png

пример файла

$ cat a
/home/parent/child 1/child 2/child 3/filename1
/home/parent/child 1/child2/filename2
/home/parent/child1/filename3

$ while read b ; do basename "$b" ; done < a
filename1
filename2
filename3

Ответ 6

Я знаю, что мне нравится 3 года, но... вы должны рассмотреть расширение параметра, оно встроено и быстрее.

если ваш вход находится в var, скажем, $var1, просто ${var1##*/}. Посмотрите ниже

$ var1='/home/parent/child1/filename'
$ echo ${var1##*/}
filename
$ var1='/home/parent/child1/child2/filename'
$ echo ${var1##*/}
filename
$ var1='/home/parent/child1/child2/child3/filename'
$ echo ${var1##*/}
filename

Ответ 7

Вы также можете использовать:

    sed -n 's/.*\/\([^\/]\{1,\}\)$/\1/p'

или

    sed -n 's/.*\/\([^\/]*\)$/\1/p'