我试图理解这段代码:
awk 'NR%2{printf "%s ",$0;next;}1' yourFile
现在我尝试定制它。
鉴于此 error.txt 内容:
KEY 4048:1736 string
3
KEY 0:1772 string
1
KEY 4192:1349 string
1
KEY 7329:2407 string
2
KEY 0:1774 string
1
然后:
awk 'NR%2{printf NR "%s ", $0; next}1' error.txt
... 将返回:
1KEY 4048:1736 string 3
3KEY 0:1772 string 1
5KEY 4192:1349 string 1
7KEY 7329:2407 string 2
9KEY 0:1774 string 1
我猜是NR%2
指偶数行号,但我不确定它1
指的是什么。
如果没有1
, awk 'NR%2{printf NR "%s ", $0; next}' error.txt
将返回一行。
1KEY 4048:1736 string 3KEY 0:1772 string 5KEY 4192:1349 string 7KEY 7329:2407 string 9KEY 0:1774 string
总的来说,我还是没明白。
到目前为止我已经看过这些页面:
答案1
那%
是模/余数算术运算符,求两个或多个数字的模除法。这NR
中的 表示当前记录号除以 2,写为条件语句,偶数记录数的结果为 0,因此 0 是错误结果,因此后面的行动不执行并且;
最后1
,将执行一个称为“始终为真”条件的习惯用法,该习惯用法将打印前几行末尾的偶数行号(只要结果为NR%2
0 就运行),其中这些行号是printf
不带换行符打印的。看awk 脚本末尾的“1”是什么意思
答案2
找一个很多更好的全面解决方案:
gawk/mawk/nawk '(ORS=ORS?"":"\n")~_'
因为默认情况下 awkORS
总是预先填充一个\n
,所以此方法始终确保将偶数行连接到其上方的行,而不必NR % 2
在需要测试 ORS 是否为空字符串时浪费时间。
==========下面是旧帖子================================
您可以将条件带入内部,而无需接下来的所有内容:
gawk/mawk/nawk '{ printf("%s%c",$0,23^(NR%2)+9) }'
在奇数行上,NR%2
计算结果为 1(真),
so 23^1+9 = 32 = ascii space.
对于偶数行,它得到 0/false,
so 23^0+9 = 1+9 = 10 = ascii new line \n