【问题标题】:Is there a difference between awk 'NR%2==1', awk 'FNR%2', and sed 'n;d'?awk 'NR%2==1'、awk 'FNR%2' 和 sed 'n;d' 之间有区别吗?
【发布时间】:2020-09-10 16:20:10
【问题描述】:

我目前正在准备一场大型比赛。以下三个命令有区别吗?练习要求我们从第一行开始打印命令ls -l 的每隔一行。

第一个命令:

ls -l | awk 'NR%2==1'

第二个:

ls -l | awk 'FNR%2'

第三个:

ls -l | sed 'n;d'

我写了第三个。前两个,我不确定我是否理解它们的作用。

【问题讨论】:

  • 快速说明:标题编辑:一般来说,任何使用“this”或“these”的标题都意味着有人必须点击并阅读问题正文才能了解问题的实际含义.尽可能避免这种情况,而是将细节放入标题本身。
  • 嗨,查尔斯,好的,我会记住的,对不起!我不想做一个“点击诱饵”。 :)

标签: linux shell awk


【解决方案1】:

awk中,NRFNR是当前输入行的记录号,第一行从1开始。如果您正在处理多个输入文件,FNR 在每个文件的开头被重置回1,而NR 会不断增加。在您的情况下,由于输入来自 stdin 而不是命名文件,因此这两个变量是等价的。

% 是取模运算符,x % yx 除以y 的余数。它通常使用y = 2 来确定一个数字是奇数还是偶数;偶数有余数0,奇数有余数1

awk '<expression>'

只要&lt;expression&gt; 为真,就会打印当前输入记录。当NR 为奇数时,NR % 2 == 1 为真(如上所述)。 FNR % 2 在同样的情况下也是如此,因为任何非零数都被认为是真实的。

所以两个awk 命令都打印ls -l 输出的奇数行。

【讨论】:

  • 好的,非常感谢您的解释。但我也想知道我是否可以使用第三个命令获得与前两个相同的结果?换句话说:如果我使用第三个命令,它可以被接受为前两个吗?对不起,我的英语不好 !谢谢!
  • 是的,结果是一样的。
  • n 将当前行写入输出并读取下一行。 d 跳过写入当前行,因此跳过第二行。
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2011-12-05
  • 2016-11-01
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多