Проблема переменных FNR и NR

Переключатель к systemd устраните эту проблему разрешения.

2
27.08.2015, 18:44
3 ответа

Используйте это вместо:

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 читает.

6
27.01.2020, 21:50

Вы объединяете ( cat ) их вместе, поэтому для awk это всего лишь один файл (или стандартный ввод в таком случае). Если вы хотите получить желаемый результат, запустите вместо этого

 awk -F, '{print FNR}' File1 File2
3
27.01.2020, 21:50

Это неверно. Когда вы катируете файлы и отправляете их в трубу, awk больше не считает файлы по отдельности, он просто получает все входные данные из трубы как один файл.

1
27.01.2020, 21:50

Теги

Похожие вопросы