Я пытаюсь использовать awk
для получения имени файла с учетом абсолютного пути к файлу.
Например, когда /home/parent/child/filename
мне задан входной путь, который я хотел бы получить, filename
я попробовал:
awk -F "/" '{print $5}' input
который отлично работает.
Однако я жестко кодирую, $5
что было бы неверно, если бы мой ввод имел следующую структуру:
/home/parent/child1/child2/filename
Таким образом, общее решение требует всегда брать последнее поле (которое будет именем файла).
Есть ли простой способ сделать это с помощью функции awk substr?
basename
является официальным способом сделать это, использованиеawk
для этого нехорошо, если говорить легкомысленно. : DОтветы:
Используйте тот факт, что
awk
строки в полях разделяются на основе разделителя полей, который вы можете определить. Следовательно, определяя разделитель полей,/
вы можете сказать:а
NF
относится к числу полех текущей записи, печати$NF
средств печати последнему.Итак, учитывая такой файл:
Это будет вывод:
источник
$(NF-1)
.В этом случае лучше использовать
basename
вместоawk
:источник
dirname
делает наоборот и удаляет файл, а не путь.Другой вариант - использовать
bash
подстановку параметров .источник
Если вы открыты для решения Perl, вот решение, подобное awk-решению Fedorqui:
-F/
указывает,/
что разделителем полей$F[-1]
является последний элемент в@F
массиве авторазбивкиисточник
Это должен быть комментарий к ответу на базовое имя, но мне не хватает смысла.
Если вы не используете двойные кавычки,
basename
не будет работать с путем, где есть пробел:хорошо с кавычками ""
пример файла
источник
Я знаю, что опаздываю на 3 года, но ... вам следует подумать о расширении параметров, оно встроено и быстрее.
если ваш ввод находится в переменной, скажем, $ var1, просто сделайте это
${var1##*/}
. Смотри нижеисточник
Как будто с опозданием на 5 лет, я знаю, спасибо за все предложения, я делал это следующим образом:
Рад заметить, что есть лучшие манеры
источник
Вы также можете использовать:
или
источник