【问题标题】:How can I get a range of line every nth interval using awk, sed, or other unix command?如何使用 awk、sed 或其他 unix 命令每隔 n 个间隔获取一系列行?
【发布时间】:2013-04-14 19:17:30
【问题描述】:

我知道如何使用 awk 和 sed 获取一系列行。 我也知道如何使用 awk 和 sed 打印出每一行。

但是,我不知道如何将两者结合起来。

例如,我有一个 1780000 行的文件。

对于每第 17800 行,我想打印第 17800 行加上之后的两行。

所以如果我有一个包含 1780000 行的文件,它从 1 开始到 1780000 结束,则会打印:

1
2
3
17800
17801
17802
35600
35601
35602
# ... and so on.

有谁知道如何使用 awk、sed 或其他 unix 命令每隔 n 个间隔获取一系列行?

【问题讨论】:

    标签: unix sed awk cat


    【解决方案1】:

    使用 GNU sed:

    sed -n '0~17800{N;N;p}' input
    

    意义,

    For every 17800th line: 0~17800
      Read two lines: {N;N;
      And print these out: p}
    

    我们也可以加上前三行:

    sed -n -e '1,3p' -e '0~17800{N;N;p}' input
    

    使用 awk 会更简单:

    awk 'NR%17800<3 || NR==3 {print}' input
    

    【讨论】:

    • 非常感谢。所以如果我想在第 n 行之后打印 100 行,我需要 100 of N;还是有更简单的方法?
    • 是的,你需要 100 个 N,在这种情况下,awk 显然是可行的方法。
    • 但是你也可以使用脚本来生成sed脚本
    • program 使用 GNU sed 的 N 数量的一种方法是 sed -n '0~17800{:a;N;s/\n/&amp;/2;Ta;p}',您可以将 2 替换为所需的数量。
    【解决方案2】:
    $ cat file
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    $ awk '!(NR%3)' file
    3
    6
    9
    
    $ awk -v intvl=3 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file
    -----
    3
    4
    -----
    6
    7
    -----
    9
    10
    
    $ awk -v intvl=4 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file
    -----
    4
    5
    -----
    8
    9
    
    $ awk -v intvl=4 -v delta=3 '!(NR%intvl){print "-----"; c=delta} c&&c--' file
    -----
    4
    5
    6
    -----
    8
    9
    10
    

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多