【问题标题】:remove rows based on multiple columns values in awk根据 awk 中的多列值删除行
【发布时间】:2018-01-29 18:09:38
【问题描述】:

我正在尝试使用 awk 从我的文本文件中删除基于第 4 列值等于 7 和第 5 列值小于 30 的行。

这是我的文本文件

1 1 2017 7 00 00 95.197469 112.803277    
1 1 2017 7 05 00 94.139040 113.255244  
1 1 2017 7 10 00 93.084220 113.715022  
1 1 2017 7 15 00 92.033141 114.182867  
1 1 2017 7 20 00 90.985940 114.659045  
1 1 2017 7 25 00 89.500772 115.143830  
1 1 2017 7 30 00 88.574990 115.637504  
1 1 2017 7 35 00 87.614221 116.140360  
1 1 2017 7 40 00 86.633495 116.652701  
1 1 2017 7 45 00 85.642547 117.174839  
1 1 2017 7 50 00 84.647055 117.707097  
1 1 2017 7 55 00 83.650410 118.249809  
1 1 2017 8 00 00 82.654745 118.803319  
1 1 2017 8 05 00 81.661486 119.367982  
1 1 2017 8 10 00 80.671646 119.944164  
1 1 2017 8 15 00 79.685987 120.532243  
1 1 2017 8 20 00 78.705118 121.132609  
1 1 2017 8 25 00 77.729550 121.745662  
1 1 2017 8 30 00 76.759731 122.371816  
1 1 2017 8 35 00 75.796072 123.011494  
1 1 2017 8 40 00 74.838956 123.665132  
1 1 2017 8 45 00 73.888755 124.333179  
1 1 2017 8 50 00 72.945832 125.016092  
1 1 2017 8 55 00 72.010551 125.714342  
1 1 2017 9 00 00 71.083276 126.428408  

【问题讨论】:

  • 另外,请在您的问题和要求中明确具体需要什么。
  • 在发布另一个问题之前请参阅How to Ask。我很惊讶你能得到任何答案。

标签: shell awk sed


【解决方案1】:

使用 awk:

awk '$4!=7 || $5>=30 {print}' file

输出:

1 1 2017 7 30 00 88.574990 115.637504 1 1 2017 7 35 00 87.614221 116.140360 1 1 2017 7 40 00 86.633495 116.652701 1 1 2017 7 45 00 85.642547 117.174839 1 1 2017 7 50 00 84.647055 117.707097 1 1 2017 7 55 00 83.650410 118.249809 1 1 2017 8 00 00 82.654745 118.803319 1 1 2017 8 05 00 81.661486 119.367982 1 1 2017 8 10 00 80.671646 119.944164 1 1 2017 8 15 00 79.685987 120.532243 1 1 2017 8 20 00 78.705118 121.132609 1 1 2017 8 25 00 77.729550 121.745662 1 1 2017 8 30 00 76.759731 122.371816 1 1 2017 8 35 00 75.796072 123.011494 1 1 2017 8 40 00 74.838956 123.665132 1 1 2017 8 45 00 73.888755 124.333179 1 1 2017 8 50 00 72.945832 125.016092 1 1 2017 8 55 00 72.010551 125.714342 1 1 2017 9 00 00 71.083276 126.428408

【讨论】:

    【解决方案2】:

    或许更简洁的awk

    删除字段 4 等于 7 字段 5 小于 30 的行

    $ awk '!($4==7 && $5<30)' case_file_48485025
    

    输出

    1 1 2017 7 30 00 88.574990 115.637504  
    1 1 2017 7 35 00 87.614221 116.140360  
    1 1 2017 7 40 00 86.633495 116.652701  
    1 1 2017 7 45 00 85.642547 117.174839  
    1 1 2017 7 50 00 84.647055 117.707097  
    1 1 2017 7 55 00 83.650410 118.249809  
    1 1 2017 8 00 00 82.654745 118.803319  
    1 1 2017 8 05 00 81.661486 119.367982  
    1 1 2017 8 10 00 80.671646 119.944164  
    .
    .
    

    工作原理

    • 默认情况下,awk 在看到非零值作为其命令时打印一行
    • !($4==7 &amp;&amp; $5&lt;30) 将在满足您的条件时评估为零,因此 awk 不会打印。

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed '/^.........7.[0-2]/d' file
      

      删除第 4 列包含 7 且第 5 列第一个字符为 02 的行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-01
        • 2019-07-06
        • 2015-11-14
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多