【问题标题】:Select specific lines with awk but not range使用 awk 但不选择范围的特定行
【发布时间】:2022-02-01 11:52:45
【问题描述】:

我想从文件中选择行。我对三个特定的行感兴趣。

输入:

line1
line2
line3
line4
line5
line6
line7

输出:

line2
line3
line7

没有选择线的特定模式。 我熟悉 sed 解决方案:

sed -n '2p; 3p; 7p' file

但是,我之后使用 awk 来选择这些行的特定字段。因此,我更愿意单独使用 awk 而不是管道 sed 和 awk。我仍然无法使用 awk 找到简单的解决方案。

【问题讨论】:

  • awk 'FNR==2 || FNR==3 || FNR==7' Input_file 这就是您要找的东西吗?这将从文件中打印第 2、3、7 行。
  • 或者如果你穿着漂亮的裤子:awk -v p=2,3,7 'BEGIN{split(p,a,/,/);for(i in a)b[a[i]]}(FNR in b)' file

标签: awk


【解决方案1】:
awk 'FNR ~ /^(2|3|7)$/{print}'

应该很巧妙地做到这一点

【讨论】:

    【解决方案2】:

    我会利用 GNU AWK 来完成这项任务,让 file.txt 内容成为

    line1
    line2
    line3
    line4
    line5
    line6
    line7
    

    然后

    awk 'BEGIN{a[2]=a[3]=a[7]=1}(NR in a){print}' file.txt
    

    输出

    line2
    line3
    line7
    

    解释:我使用数组a 为键237 设置值。如果当前数字行 (NR) 是 I print 所述行的键集之一。

    (在 gawk 4.2.1 中测试)

    【讨论】:

      【解决方案3】:
      $ awk 'BEGIN{split("2 3 7",tmp); for (i in tmp) nrs[tmp[i]]} NR in nrs' file
      line2
      line3
      line7
      

      【讨论】:

      • 这使得较长数字的符号更容易++
      • @Thefourthbird 它也比当前接受的答案中的正则表达式比较快,因为它只是进行哈希查找。
      【解决方案4】:

      使用字符类匹配237FNR匹配当前文件的记录号:

      awk 'FNR ~ /^[237]$/' file
      

      输出

      line2
      line3
      line7
      

      如果您有一个大文件并且您知道最大行数,您也可以在达到它时停止处理:

      awk 'FNR ~ /^[237]$/{
        print
        if (FNR == 7) exit
      }' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-10
        • 1970-01-01
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多