【问题标题】:Delete duplicate lines through pattern in bash通过bash中的模式删除重复的行
【发布时间】:2018-01-10 17:56:32
【问题描述】:

我必须对一些 txt 文件进行后处理,这些文件由一些重复的字符串组成,格式为“TER”,例如

ATOM  47047  H1  WAT  11303    -32.626 -35.728 -30.283  1.00  0.00
ATOM  47048  H2  WAT  11303    -33.975 -35.757 -30.969  1.00  0.00
TER
TER
TER
TER
TER
ATOM  47052  O   WAT  11305    -38.279 -35.930 -33.162  1.00  0.00
ATOM  47053  H1  WAT  11305    -37.860 -35.087 -33.334  1.00  0.00
ATOM  47054  H2  WAT  11305    -39.198 -35.793 -33.391  1.00  0.00
TER
TER
ATOM  47055  O   WAT  11306    -35.943 -38.199 -31.778  1.00  0.00
ATOM  47056  H1  WAT  11306    -35.823 -38.794 -31.039  1.00  0.00
ATOM  47057  H2  WAT  11306    -35.083 -38.162 -32.198  1.00  0.00
TER
ATOM  47058  O   WAT  11307    -33.604 -37.645 -33.202  1.00  0.00
ATOM  47059  H1  WAT  11307    -34.130 -37.121 -33.805  1.00  0.00
ATOM  47060  H2  WAT  11307    -33.261 -37.012 -32.571  1.00  0.00
TER
TER
TER
ATOM  47061  O   WAT  11308    -40.428 -29.625 -32.046  1.00  0.00
ATOM  47062  H1  WAT  11308    -40.966 -28.900 -32.365  1.00  0.00
ATOM  47063  H2  WAT  11308    -40.175 -30.102 -32.837  1.00  0.00
TER

在此日志中,我想删除所有重复多次的 TER 字符串,只保留第一个带有 TER 的字符串。例如

ATOM  47047  H1  WAT  11303    -32.626 -35.728 -30.283  1.00  0.00
ATOM  47048  H2  WAT  11303    -33.975 -35.757 -30.969  1.00  0.00
TER
ATOM  47052  O   WAT  11305    -38.279 -35.930 -33.162  1.00  0.00
ATOM  47053  H1  WAT  11305    -37.860 -35.087 -33.334  1.00  0.00
ATOM  47054  H2  WAT  11305    -39.198 -35.793 -33.391  1.00  0.00
TER
ATOM  47055  O   WAT  11306    -35.943 -38.199 -31.778  1.00  0.00
ATOM  47056  H1  WAT  11306    -35.823 -38.794 -31.039  1.00  0.00
ATOM  47057  H2  WAT  11306    -35.083 -38.162 -32.198  1.00  0.00
TER
ATOM  47058  O   WAT  11307    -33.604 -37.645 -33.202  1.00  0.00
ATOM  47059  H1  WAT  11307    -34.130 -37.121 -33.805  1.00  0.00
ATOM  47060  H2  WAT  11307    -33.261 -37.012 -32.571  1.00  0.00
TER
ATOM  47061  O   WAT  11308    -40.428 -29.625 -32.046  1.00  0.00
ATOM  47062  H1  WAT  11308    -40.966 -28.900 -32.365  1.00  0.00
ATOM  47063  H2  WAT  11308    -40.175 -30.102 -32.837  1.00  0.00
TER

我将感谢任何带有 bash 命令的解决方案,例如 sedgrepawk

【问题讨论】:

    标签: bash text awk sed grep


    【解决方案1】:

    检查

    uniq -d
    

    如果只有 TER 行是重复的,那么

    uniq
    

    删除重复的 TER 行。

    【讨论】:

      【解决方案2】:

      sed解决方案:

      sed '$!N;/TER\nTER/!P;D;' file
      
      • $!N - 将下一行添加到模式空间(分析每对行)直到最后一行$

      • /TER\nTER/!P;D; - 如果它们不包含相同的 TER 值,则仅打印模式空间中的第一行

      输出:

      ATOM  47047  H1  WAT  11303    -32.626 -35.728 -30.283  1.00  0.00
      ATOM  47048  H2  WAT  11303    -33.975 -35.757 -30.969  1.00  0.00
      TER
      ATOM  47052  O   WAT  11305    -38.279 -35.930 -33.162  1.00  0.00
      ATOM  47053  H1  WAT  11305    -37.860 -35.087 -33.334  1.00  0.00
      ATOM  47054  H2  WAT  11305    -39.198 -35.793 -33.391  1.00  0.00
      TER
      ATOM  47055  O   WAT  11306    -35.943 -38.199 -31.778  1.00  0.00
      ATOM  47056  H1  WAT  11306    -35.823 -38.794 -31.039  1.00  0.00
      ATOM  47057  H2  WAT  11306    -35.083 -38.162 -32.198  1.00  0.00
      TER
      ATOM  47058  O   WAT  11307    -33.604 -37.645 -33.202  1.00  0.00
      ATOM  47059  H1  WAT  11307    -34.130 -37.121 -33.805  1.00  0.00
      ATOM  47060  H2  WAT  11307    -33.261 -37.012 -32.571  1.00  0.00
      TER
      ATOM  47061  O   WAT  11308    -40.428 -29.625 -32.046  1.00  0.00
      ATOM  47062  H1  WAT  11308    -40.966 -28.900 -32.365  1.00  0.00
      ATOM  47063  H2  WAT  11308    -40.175 -30.102 -32.837  1.00  0.00
      TER
      

      【讨论】:

        【解决方案3】:

        尝试 sed:

        sed '/^TER/{N;/\nTER\s*$/D}' urfile
        

        【讨论】:

          【解决方案4】:

          跟踪上一行,当它是TER时不打印该行,如果上一行也是“TER”:

          awk '!/^TER$/ || prev != "TER" { print } { prev = $0 }' file
          

          您也可以跳过显式的 { print } 块,因为这是默认操作:

          awk '!/^TER$/ || prev != "TER"; { prev = $0 }' file
          

          【讨论】:

            【解决方案5】:

            这是另一个 awk 版本:

            awk '/^TER/{ c++; if ( c == 1 ){ print }}/^ATOM/{ print; c = 0 }' file
            

            【讨论】:

              【解决方案6】:
              awk '!/^TER/{c=1}c; /^TER/{c=0}' file
              

              c设置为标志以确定是否打印。

              • 在非“TER”情况下,设置标志并打印。
              • 如果遇到第一个“TER”,由于c 仍然打开,它会打印该行,然后设置c 向下。
              • 由于c 保持关闭,因此不会打印连续的“TER”。

              【讨论】:

                【解决方案7】:
                $ awk '$1=="TER" && p=="TER"{next} {print; p=$1}' file
                ATOM  47047  H1  WAT  11303    -32.626 -35.728 -30.283  1.00  0.00
                ATOM  47048  H2  WAT  11303    -33.975 -35.757 -30.969  1.00  0.00
                TER
                ATOM  47052  O   WAT  11305    -38.279 -35.930 -33.162  1.00  0.00
                ATOM  47053  H1  WAT  11305    -37.860 -35.087 -33.334  1.00  0.00
                ATOM  47054  H2  WAT  11305    -39.198 -35.793 -33.391  1.00  0.00
                TER
                ATOM  47055  O   WAT  11306    -35.943 -38.199 -31.778  1.00  0.00
                ATOM  47056  H1  WAT  11306    -35.823 -38.794 -31.039  1.00  0.00
                ATOM  47057  H2  WAT  11306    -35.083 -38.162 -32.198  1.00  0.00
                TER
                ATOM  47058  O   WAT  11307    -33.604 -37.645 -33.202  1.00  0.00
                ATOM  47059  H1  WAT  11307    -34.130 -37.121 -33.805  1.00  0.00
                ATOM  47060  H2  WAT  11307    -33.261 -37.012 -32.571  1.00  0.00
                TER
                ATOM  47061  O   WAT  11308    -40.428 -29.625 -32.046  1.00  0.00
                ATOM  47062  H1  WAT  11308    -40.966 -28.900 -32.365  1.00  0.00
                ATOM  47063  H2  WAT  11308    -40.175 -30.102 -32.837  1.00  0.00
                TER
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-12-02
                  • 1970-01-01
                  • 2022-09-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多