帮助破译这个 awk 命令

帮助破译这个 awk 命令

我正在学习 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}否则

相关内容