Как получить номер файла, который обрабатывается скриптом awk? - PullRequest
0 голосов
/ 19 сентября 2019

Предположим, у меня есть 2 или более файлов, обрабатываемых сценарием awk .

$ cat file1
a
b
c

$ cat file2
d
e

Как узнать номер обрабатываемого файла?Является ли встроенный awk для этого?

Я хочу иметь скрипт с поведением одного ниже.Что я мог бы использовать в качестве моего SOMEVARIABLE?

$ awk '{print FILENAME, NR, FNR, SOMEVARIABLE, $0}' file1 file2
file1 1 1 1 a
file1 2 2 1 b
file1 3 3 1 c
file2 4 1 2 d
file2 5 2 2 e

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

РЕДАКТИРОВАТЬ: Поскольку OP требует вывода в определенном формате и НЕ требует только подсчета файлов, поэтому добавьте следующее решение сейчас, которое также должно учитывать количество пустых файлов (проверено изаписано в GNU awk)

awk '
FNR==1{
  FNUM++
}
{
  print FILENAME, NR, FNR, FNUM, $0
}
ENDFILE{
  if(FNUM==prev){
    FNUM++
    print FILENAME, 0, 0, FNUM, "Empty file"
  }
prev=FNUM
}' file1 file2

Вывод для 1 Input_file1 и пустого Input_file2 происходит следующим образом.

file1 1 1 1 a
file1 2 2 1 b
file1 3 3 1 c
file2 0 0 2 Empty file



Решения, когда нужно узнать общее количество файлов, обработанных командой awk:

1-е решение: Не могли бы вы попробовать следующее, используя GNU awk (учитывая, что здесь вы не хотите считать пустые файлы).

awk 'NF{count++;nextfile} END{print count}' Input_file1  Input_file2


2-е решение: Если вы хотите узнать только количество файлов, переданных команде awk, попробуйте выполнить следующее.

awk 'END {print ARGC-1}' Input_file1 Input_file2

Объяснение приведенных выше кодов с примерами: Допустим, следующие являются Input_files, где Input_file1 имеет содержимое, а Input_file2 является пустым файлом следующим образом:

cat Input_file1
a
b
c
> Input_file2

Теперь, когда мы запускаем команду ARGC, мы получаем вывод в виде 2 файлов.

awk 'END {print ARGC-1}'  Input_file1  Input_file2
2

Теперь, когда я запускаю свою 1-ю команду, она выдает 1 файл, так как он не считает пустой файл.

awk 'NF{count++;nextfile} END{print count}'  Input_file1  Input_file2
1
0 голосов
/ 19 сентября 2019

Хорошо ... Мне удалось сделать это следующим образом:

$ awk 'BEGIN{FNUM=0} FNR==1{FNUM++} {print FILENAME, NR, FNR, FNUM, $0}' file1 file2
file1 1 1 1 a
file1 2 2 1 b
file1 3 3 1 c
file2 4 1 2 d
file2 5 2 2 e

Я думаю, что нет встроенной переменной, чтобы помочь с этим, поэтому я создал переменную FNUM (для номера файла).Если есть решение со встроенной переменной, пожалуйста, дайте мне лучший ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...