Используйте это вместо:
awk -F, '{print FNR}' file1 file2
Переменная FNR
в awk дает количество записей для каждого входного файла. Но, когда вы используете cat ... | awk
awk читает для дескриптора файла stdin, поэтому awk видит только 1 "файл".
Попробуйте сделать это, чтобы лучше понять (FILENAME
содержит текущий обрабатываемый файл):
$ awk -F, '{print FILENAME" "FNR}' file1 file2
file1 1
file1 2
file1 3
file2 1
file2 2
file2 3
file2 4
$ cat file1 file2 | awk -F, '{print FILENAME" "FNR}'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Как вы можете видеть в первом примере, обрабатывается 2 файла, во втором примере FILENAME
- -
, что указывает на стандартный ввод.
Изменить: См. следующий пример:
$ cat file1 | awk -F, '{print FILENAME" "FNR}' - file1 <(cat file1)
- 1
- 2
- 3
file1 1
file1 2
file1 3
/dev/fd/63 1
/dev/fd/63 2
/dev/fd/63 3
Сначала awk читает из stdin (часть cat file1
, также являющаяся параметром -
для awk). Затем обычный file1
. Наконец, часть <(cat file1)
, которая создает трубу (/dev/fd/63
), откуда awk читает.
Вы объединяете ( cat
) их вместе, поэтому для awk
это всего лишь один файл (или стандартный ввод в таком случае). Если вы хотите получить желаемый результат, запустите вместо этого
awk -F, '{print FNR}' File1 File2
Это неверно. Когда вы катируете файлы и отправляете их в трубу, awk больше не считает файлы по отдельности, он просто получает все входные данные из трубы как один файл.