【问题标题】:Search for a value in a file and remove subsequent lines在文件中搜索一个值并删除后续行
【发布时间】:2013-06-10 16:25:15
【问题描述】:

我正在开发一个 shell 脚本,但我被下面的部分卡住了。

我有文件sample.txt:

S.No    Sub1    Sub2
1       100     200
2       100     200
3       100     200
4       100     200
5       100     200
6       100     200
7       100     200

我想搜索sample.txt 中的S.No 列。例如,如果我正在搜索值 5,我只需要最多 5 行 I 不希望 S.NO 中的值大于 5 之后的行。

输出必须类似于output.txt

S.No    Sub1    Sub2
1       100     200
2       100     200
3       100     200
4       100     200
5       100     200

【问题讨论】:

    标签: shell unix awk


    【解决方案1】:

    打印第一行和第一个字段小于或等于 5 的任何其他行:

    $ awk 'NR==1||$1<=5' file
    S.No    Sub1    Sub2
    1       100     200
    2       100     200
    3       100     200
    4       100     200
    5       100     200
    

    【讨论】:

    • 我已经修改了awk -F ':' 'NR==1||$2&lt;=$ZerodollarHour' file 之类的代码,但它不起作用
    • 我声明ZerodollarHour=date '+%H'
    • 我知道了awk -F ':' 'NR==1||$2&lt;='$ZerodollarHour'' file。非常感谢!
    • 正确的方法是使用-v选项awk -F: -v z="$ZerodollarHour" 'NR==1||$2&lt;=z' file
    【解决方案2】:

    使用perl:

    perl -ane 'print if $F[$1]<=5' file
    

    【讨论】:

    • 当S.No 的值为 11 或 123 等时,你认为会发生什么...这对于正则表达式来说不是问题!
    • @sudo_O 是的,将答案更改为使用perl。并不是说 OP 无法通过 regex 获得所需的输出,尽管它可能会变得太复杂而无法处理每个边缘场景。
    【解决方案3】:

    还有 sed 解决方案

    n=5
    sed "/^$n[[:space:]]/q" filename
    

    打印当前行后sedq命令退出

    【讨论】:

      【解决方案4】:

      建议的 awk 依赖于第 1 列是数字排序的。满足问题标题的通用 awk 将是:

      gawk -v p=5 '$1==p {print; exit} {print}' 
      

      但是,在这种情况下,sed 是更好的 IMO。使用 -i 修改输入文件。

      【讨论】:

        【解决方案5】:
        sed '6q' sample.txt > output.txt
        

        【讨论】:

          猜你喜欢
          • 2013-09-29
          • 2021-10-15
          • 1970-01-01
          • 2022-11-24
          • 2019-04-10
          • 1970-01-01
          • 2019-10-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多