Вы используете printf (), поэтому правильный синтаксис:
$ cat file1.txt
line1
line2
line3
line4
$ awk ' NR%2==0 {printf("%s %s\n", FILENAME ": ", $0) } ' file1.txt
file1.txt: line2
file1.txt: line4
$
Когда вы используете
$ awk '{printf FILENAME ": "} NR%2==0' file1.txt
file1.txt: file1.txt: line2
file1.txt: file1.txt: line4
$
printf печатает file1.txt:
, а затем для каждого четного номера строки NR% 2 == 0 оценивается как true, поэтому он печатает снова file1.txt: line2
Чтобы узнать, что происходит, просто удалите NR% 2 == 0,
$ awk '{printf FILENAME ": "} ' file1.txt
file1.txt: file1.txt: file1.txt: file1.txt:
$
Итак, printf просто печатает имя файла без новых строк. Правильное использование printf () похоже на синтаксис C - укажите спецификатор формата% s для строки,% d для Int и т. Д., А затем переменную.
бывший printf("%d %s\n", NR, $0 )
$ awk ' { printf("%d %s\n", NR, $0 ) }' file1.txt
1 line1
2 line2
3 line3
4 line4
$
Обратите внимание, что есть разница между тем, где вы размещаете условие
awk ' NR%2==0 {printf("%s %s\n", FILENAME ": ", $0) } ' file1.txt
отличается от
awk ' {printf("%s %s\n", FILENAME ": ", $0) } NR%2==0 ' file1.txt
Оба дают разные результаты
Первый проверяет условие, а затем печатает - так вы получите только 2 строки.
Вторая печатает все строки по умолчанию, и когда «NR% 2 == 0» имеет значение true, $ 0 снова печатается - вы получите 6 строк (4 оригинала + 2 для истинного условия)
Надеюсь, это поможет.