通过bash中的模式删除重复的行

时间:2017-08-03 08:34:18

标签: bash text awk sed grep

我必须对一些包含一些重复字符串的txt文件进行后处理,其格式为" TER" e.g

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的第一个字符串。 E.g

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

对于使用b sedgrepawk等bash命令的解决方案,我将不胜感激。

7 个答案:

答案 0 :(得分:3)

检查

uniq -d

如果只有TER行重复,那么

uniq

删除重复的TER行。

答案 1 :(得分: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

答案 2 :(得分:1)

尝试sed:

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

答案 3 :(得分:0)

跟踪前一行,如果前一行是“{”,则不打印TER行:

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

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

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

答案 4 :(得分:0)

这是另一个awk版本:

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

答案 5 :(得分:0)

awk '!/^TER/{c=1}c; /^TER/{c=0}' file

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

  • 在非“TER”情况下,设置标记并打印。
  • 如果遇到第一个“TER”,由于c仍处于启用状态,它会打印该行,然后将c设置为。{/ li>
  • c停留以来,不会打印连续的“TER”。

答案 6 :(得分:0)

$ 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