Не так элегантно, как решение POSIX FILENAME, но и полезно для пыльных, старых awk
, которые не имеют слишком много функций. Вы можете сделать составную инструкцию, которая манипулирует данные перед отправкой awk
в несколько способов ...
Вариант 1
Во-первых, вы можете выводить НомерФайла по себе перед каждым файлом, который Вы отправьте на номер awk
.Так что, если ваши файлы выглядеть следующим образом:
file1
Line 1 of 1
file2
Line 1 of 2
Line 2 of 2
file3
Line 1 of 3
Line 2 of 3
Line 3 of 3
Вы можете сделать это:
{ echo 1; cat file1; echo 2; cat file2; echo 3; cat file3; }
1
Line 1 of 1
2
Line 1 of 2
Line 2 of 2
3
Line 1 of 3
Line 2 of 3
Line 3 of 3
и трубу, в awk
и затем подобрать Номер_файла каждый раз, когда число полей 1
{ echo 1; cat file1; echo 2; cat file2; echo 3; cat file3; } | awk 'NF==1{file=$1;next} {print file,$0}'
1 Line 1 of 1
2 Line 1 of 2
2 Line 2 of 2
3 Line 1 of 3
3 Line 2 of 3
3 Line 3 of 3
Вариант 2
Или вы может редактировать номер файла на начало или конец каждой строки, поэтому он доступен как $1
внутри awk
, например:
{ sed 's/^/1 /' file1; sed 's/^/2 /' file2; sed 's/^/3 /' file3; }
1 Line 1 of 1
2 Line 1 of 2
2 Line 2 of 2
3 Line 1 of 3
3 Line 2 of 3
3 Line 3 of 3
Итак, теперь вы можете сделать
{ sed 's/^/1 /' file1; sed 's/^/2 /' file2; sed 's/^/3 /' file3; } | awk '{file=$1; ...}'
Я до сих пор голосуют за @ fedorqui решение которого, хотя :-)
'FNR' ==«Входной номер записи в текущем входном файле «. 'NR' ==" Общее количество входных записей, зарегистрированных до сих пор. " поэтому 'FNR == NR' для первого файла и отличается для каждого другого файла. Что вы пытаетесь сделать со своим третьим файлом? –