Сценарий GAWK - Печать имени файла в разделе BEGIN

Я пишу gawk-скрипт, который начинается

#!/bin/gawk -f
BEGIN { print FILENAME }

Я вызываю файл через ./script file1.html, но скрипт ничего не возвращает. Любые идеи?


person jonseager    schedule 26.03.2011    source источник


Ответы (4)


вы можете использовать ARGV[1] вместо FILENAME, если вы действительно хотите использовать его в блоке BEGIN

awk 'BEGIN{print ARGV[1]}' file
person kurumi    schedule 26.03.2011
comment
Это работает, если есть имя файла, но не печатает тире, если его нет (поэтому скрипт читает со стандартного ввода). - person Jonathan Leffler; 26.03.2011
comment
@ Джонатан, в вопросе говорится, что я вызываю файл через ./script file1.html - person kurumi; 27.03.2011
comment
+1, но с предупреждением, что если вы используете это, вы не можете использовать какие-либо аргументы командной строки. Так что, если ./script file1.html это единственный способ, которым это когда-либо будет работать, это нормально. Если вы когда-нибудь добавите ./script --argument1ofn file1.html, вы снова облажаетесь. - person JUST MY correct OPINION; 27.03.2011

Вы можете напечатать имя файла, когда встретите строку 1:

FNR == 1

Если вы хотите быть менее загадочным, более понятным:

FNR == 1 {print}

ОБНОВИТЬ

Мои первые два решения были неверны. Спасибо, Денис, за указание. Его путь правильный:

FNR == 1 {print FILENAME}
person Hai Vu    schedule 26.03.2011
comment
Любой из них печатает первую запись файла. Правильный способ использования вашей техники для нужд OP: FNR == 1 {print FILENAME} (другими словами, хотя ваш менее загадочный подход будет применяться в случае печати $0, он (и имя переменной) требуется в этом случае). +1 в любом случае - person Dennis Williamson; 09.02.2012
comment
Это работает для нескольких файлов, в то время как принятый ответ работает только для первого входного файла. Это должен быть принятый ответ. Отличная работа ! +1 - person Sergiy Kolodyazhnyy; 15.06.2015

Прямо со страницы руководства (слегка переформатированный):

FILENAME: Имя текущего входного файла. Если в командной строке файлы не указаны, значение FILENAME равно «-». Однако FILENAME не определено внутри блока BEGIN (если только оно не установлено getline).

person JUST MY correct OPINION    schedule 26.03.2011

Основываясь на ответе Хай Ву, я предлагаю, чтобы, если вы хотите, чтобы имя файла печаталось только один раз для каждого файла, оно должно быть заключено в условное условие.

if(FNR == 1) { print FILENAME };
person Warren Wright    schedule 17.04.2016