如何在bash中每隔一行的内容上打印其他字符串?

时间:2019-01-11 02:54:18

标签: unix awk

我正在使用awk '{printf FILENAME ": "} NR%2==0' "$file",但它正在为每一行打印文件名。所需的行为是它仅在偶数行旁边打印文件名。

当前输出:

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

所需的输出:

file1: line2
file1: line4

2 个答案:

答案 0 :(得分:2)

请您尝试以下。

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

或按照OP的尝试进行操作,以防您以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"

答案 1 :(得分:2)

您正在使用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,为Int指定%d,以此类推。 前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

两者给出不同的结果

第一个检查条件,然后打印-这样您只得到两行。 第二个默认打印所有行,并且当“ NR%2 == 0”为true时,将再次打印$ 0-您将获得6行(4原始+ 2表示真实条件)

希望这会有所帮助。