我正在学习 awk 一本书,我得到了这个例子,但没有真正解释发生了什么:
awk ' NR%2 {printf "%s,", $0; next;}1 ' < linepairs.csv
对于上下文,linepairs.csv 是一个包含多个 csv 值的行的文件:
a,b,c,d
e,f,g,h
i,j,k,l
等等...
这个 awk 命令应该将行连接在一起。我一直在尝试它,改变NR%2
认为(NR%2==0)
它们是等效的,但它给了我相反的结果。我了解 printf 的工作原理,而且我刚刚了解了“next”,但我不确定那里到底在做什么。最后,最后的1真的让我很困惑,因为之前书里没有提到过。
如果有人能为我翻译这个命令,那就太棒了。
答案1
Awk 程序由规则组成pattern {action}
。{action}
如果pattern
评估结果为 TRUE,则执行。 awk 中的 TRUE 由 a 表示非- 零值。因此NR%2
相当于NR%2 != 0
pattern {action}
可以省略其中之一或其他。
如果
pattern
不存在,则{action}
应用于每条记录如果
{action}
不存在,则默认操作是{print}
该模式1
通常用作“始终为真”模式,以便{print}
为每个记录调用默认操作。
规则从左到右阅读。该next
语句用于跳过任何剩余的规则。
因此awk ' NR%2 {printf "%s,", $0; next;}1 ' < linepairs.csv
执行
printf "%s,", $0
如果NR%2
计算结果为非零,则跳过该模式1
及其默认{print}
操作
和
{print}
否则