我正在使用awk '{printf FILENAME ": "} NR%2==0' "$file"
,但它正在为每一行打印文件名。所需的行为是它仅在偶数行旁边打印文件名。
当前输出:
file1: file1: line2
file1: file1: line4
file1:
所需的输出:
file1: line2
file1: line4
答案 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表示真实条件)
希望这会有所帮助。