【问题标题】:Delete a regularly recurring group of rows in a text file删除文本文件中定期重复的行组
【发布时间】:2017-09-26 19:30:36
【问题描述】:

假设我有一个包含该类型科学数据的大文本文件

1.1 1 -105.122
1.1 2 -114.091
1.1 3 -99.913
1.2 1 -103.564
1.2 2 -108.001
1.2 3 -102.402
1.3 1 -104.875
1.4 2 -108.223
1.4 3 -100.291
...

我们将前 3 行称为 1.1 组,接下来的 3 行称为 1.2 组,等等。

假设这种模式重复。

我想解析这个文件并删除所有其他组,以便结果包含组 1.1、1.3、1.5、1.7 等并删除 1.2、1.4、1.6 等。

我一直在查看 AWK 命令(刚刚开始学习 AWK),但似乎找不到执行此操作的方法。有什么建议?

【问题讨论】:

  • 1.3只有一行,1.4第2列是2而不是1开头是不是错字?
  • 是的,抱歉,打错了

标签: ubuntu awk sed


【解决方案1】:

awk是你的朋友:

awk -v FS="." '$2%2==1' file

样本输出

1.1 1 -105.122
1.1 2 -114.091
1.1 3 -99.913
1.3 1 -104.875

肮脏的把戏

  • 使用. 作为分隔符,字段2 将包含1 1 -1052 1 -103 等字符串。
  • 在执行$2%2 时,空格后的任何内容都会被忽略。
  • 现在,您需要 1.1、1.3、1.5 等等。这意味着您正在寻找小数点后的奇数。这就是我们对$2%2==1 所做的事情。
  • 注意默认操作awk 是打印记录。因此,如果条件为真,则只打印记录。

【讨论】:

    【解决方案2】:

    Perl 的救援:

    perl -ane 'if ($current ne $F[0]) {
                    $should_print = ! $should_print;
                    $current = $F[0];
                }
                print if $should_print;
               ' input
    
    • -n逐行处理输入
    • -a 将每一行拆分为空白处的 @F 数组,因此 $F[0] 是第一列
    • $current 记住当前组
    • $should_print 如果我们要输出组,则为真

    在每次组更改时,$should_print 会在真假之间切换,并更新当前组。

    【讨论】:

      【解决方案3】:

      您可以使用这样的小 awk 脚本来完成:

      script.awk

      $1 != old  { old = $1; grp++ };
      grp % 2   
      

      awk -f script.awk 你的文件

      脚本将每一行的当前$1old 值进行比较。当检测到组更改时,old 会更改,grp 会递增。

      第二行检测grp 是偶数还是奇数。在奇怪的情况下,条件为真,打印行的默认操作开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-17
        • 2018-01-31
        • 2011-09-17
        • 2014-10-30
        • 2018-06-05
        • 2018-07-27
        • 1970-01-01
        相关资源
        最近更新 更多