Как напечатать дополнительную строку в содержимом каждой другой строки в bash? - PullRequest
0 голосов
/ 11 января 2019

Я использую awk '{printf FILENAME ": "} NR%2==0' "$file", но он печатает имя файла для каждой строки. Желаемое поведение - печатать только имя файла рядом с четными строками.

Токовый выход:

file1: file1: line2
file1: file1: line4
file1:

Желаемый вывод:

file1: line2
file1: line4

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вы используете 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 для истинного условия)

Надеюсь, это поможет.

0 голосов
/ 11 января 2019

Не могли бы вы попробовать следующее.

awk 'FNR%2==0{print FILENAME": " $0}'  Input_file

ИЛИ в соответствии с попыткой ОП в случае, если вы передаете переменную в темпе Input_file

awk 'FNR%2==0{print FILENAME": " $0}' "$file"

Чтобы избежать слишком большого количества открытых файлов, попробуйте выполнить один раз.

awk 'prev!=FILENAME{close(prev)} FNR%2==0{print FILENAME": " $0} FNR==1{prev=FILENAME}' "$file"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...