Получить последнее поле с использованием awk substr
У меня есть простое требование:
Я получаю имена файлов с абсолютным каталогом.
Например /home/parent/child/filename
Мое требование - вырезать имя файла из этого.
Я пробовал:
awk -F "/" '{print $5}' input
который отлично работает.
Но здесь есть жесткое кодирование $5
, которое может отличаться, если мой ввод имеет структуру следующим образом:
/home/parent/child1/child2/filename
Поэтому он должен быть динамическим без жесткого кодирования. Вот логика:
Всегда берете последнее поле, которое будет именем файла (так что нужно проверить с реверса).
Может ли кто-нибудь помочь мне с помощью функции awk substr или любой другой функции?
Ответы
Ответ 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'