【问题标题】:AWK to print every nth line from a fileAWK 打印文件中的每 n 行
【发布时间】:2013-08-23 12:22:11
【问题描述】:

我想使用 AWK 打印文件的每第 N 行。 我尝试修改一般格式:-

awk '0 == NR % 4' results.txt

到:-

awk '0 == NR % $ct' results.txt

其中 'ct' 是应跳过的行数。 它不工作。谁能帮帮我? 提前致谢。

【问题讨论】:

标签: awk


【解决方案1】:

您可能想使用:

awk -v patt="$ct" 'NR % patt' results.txt

说明

给定如下文件:

$ cat -n a
     1  hello1
     2  hello2
     3  hello3
     4  hello4
     5  hello5
     ...
    37  hello37
    38  hello38
    39  hello39
    40  hello40

这些是等价的:

$ awk 'NR % 7 == 0' a
hello7
hello14
hello21
hello28
hello35
$ ct=7
$ awk -v patt="$ct" 'NR % patt == 0' a
hello7
hello14
hello21
hello28
hello35

甚至

$ awk -v patt="$ct" '!(NR % patt)' a

注意语法NR % n == 0的意思是:行数是n的倍数。如果我们说!(NR % patt),那么只要NR % patt 为假就成立,即NRpatt 的倍数。

更新

当您评论您使用的是 Solaris,而不是默认的 awk 时,请使用以下内容:

/usr/xpg4/bin/awk

【讨论】:

  • 感谢您的快速回复.. 但是当我使用它时,我收到以下错误:awk: syntax error near line 1 awk: bailing out near line 1
  • awk -v pattern="$ctr" 'NR % pattern == 0' res.txt
  • 它对我有用。您是否事先将ctr 设置为整数值?
  • 使用/usr/xpg4/bin/awk 而不是普通的awk。 (objectmix.com/awk/27239-awk-bailing-out-near-line-1-a.html)
  • 是的,我做到了。我做到了ctr=cat data | grep -i "记录已关闭" | wc -l`` 我用它来计算模式“记录关闭”在名为“数据”的文件中的出现
【解决方案2】:

这也有效,但不是一个好习惯。

awk '!(NR%'$ct')' results.txt

这个可以用:

awk '!(NR%n)' n="$ct" results.txt

【讨论】:

  • 永远不要使用第一个版本,因为根据 shell 变量的值,您可能会得到奇怪的输出和/或神秘的错误消息。第二个版本很好,但之前已经有其他几个人建议过。
  • 感谢您的快速回复.. 但是当我使用它时,我收到以下错误:awk: syntax error near line 1 awk: bailing out near line 1
  • 谢谢 :) 我们可以用 nawk 做同样的事情吗?因为我使用普通的 awk,所以我无法执行它。正如我前面提到的,我收到了一个保释错误。请帮助我。
【解决方案3】:

这个怎么样:

awk -v n="$ct" '0 == NR % n' results.txt

或者更短一点

awk -v n="$ct" '!(NR % n)' results.txt

【讨论】:

  • 感谢您的快速回复.. 但是当我使用它时,我收到以下错误:awk: syntax error near line 1 awk: bailing out near line 1 那里有什么问题?
猜你喜欢
  • 1970-01-01
  • 2015-03-06
  • 2018-09-04
  • 2015-02-04
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多