如何从文本文件的字段中删除特定的重复字符串?

如何从文本文件的字段中删除特定的重复字符串?

我有一个包含三列的文件,我需要删除包含特定重复字段的行。

 1 V(Cl8)                         2.121
 2 V(C1,H3)                       2.067
 3 V(Cl7)                         2.121
 4 V(Cl7)                         1.347
 5 V(C4,H6)                       2.067
 6 V(Cl8)                         1.347
 7 V(Cl8)                         0.918
 8 V(C1,Cl7)                      1.220
 9 V(C4,Cl8)                      1.220
10 V(Cl7)                         0.918
11 V(C1,C4)                       1.958
12 C(Cl8)                         7.668
13 C(Cl7)                         7.668
14 C(C1)                          2.087
15 C(C4)                          2.087
16 C(Cl8)                         2.267
17 C(Cl7)                         2.267
18 V(C1,H2)                       2.067
19 V(Cl8)                         2.122
20 V(Cl7)                         2.122
21 V(C4,H5)                       2.067

我需要删除包含重复的 C(Cl8) 和 C(Cl7) 的行,以便在输出中每行只出现一次。

sort我尝试了像and 之类的命令uniq,但是所有重复的字符串都被删除了。

所需的输出(请注意,我不关心保留哪个事件,我只关心我只有一个C(Cl8)和一个C(Cl7)

 1 V(Cl8)                         2.121
 2 V(C1,H3)                       2.067
 3 V(Cl7)                         2.121
 4 V(Cl7)                         1.347
 5 V(C4,H6)                       2.067
 6 V(Cl8)                         1.347
 7 V(Cl8)                         0.918
 8 V(C1,Cl7)                      1.220
 9 V(C4,Cl8)                      1.220
10 V(Cl7)                         0.918
11 V(C1,C4)                       1.958
13 C(Cl7)                         7.668
14 C(C1)                          2.087
15 C(C4)                          2.087
16 C(Cl8)                         2.267
18 V(C1,H2)                       2.067
19 V(Cl8)                         2.122
20 V(Cl7)                         2.122
21 V(C4,H5)                       2.067

答案1

如果您不关心删除哪些重复项并且可以保留第一个出现项并删除其余项,则可以使用:

$ awk '/C\(Cl8\)/ && ++a > 1{next} /C\(Cl7\)/ && ++b > 1{next}1' file | color -l 'C\(Cl7\)','C\(Cl8\)'
 1 V(Cl8)                         2.121
 2 V(C1,H3)                       2.067
 3 V(Cl7)                         2.121
 4 V(Cl7)                         1.347
 5 V(C4,H6)                       2.067
 6 V(Cl8)                         1.347
 7 V(Cl8)                         0.918
 8 V(C1,Cl7)                      1.220
 9 V(C4,Cl8)                      1.220
10 V(Cl7)                         0.918
11 V(C1,C4)                       1.958
12 C(Cl8)                         7.668
13 C(Cl7)                         7.668
14 C(C1)                          2.087
15 C(C4)                          2.087
18 V(C1,H2)                       2.067
19 V(Cl8)                         2.122
20 V(Cl7)                         2.122
21 V(C4,H5)                       2.067

答案2

这是一个选项:

$ sort -k2,2 file | sed -e 'N;s/^\(.*C(Cl7).*\)\n.*C(Cl7).*/\1/' -e 's/^\(.*C(Cl8).*\)\n.*C(Cl8).*/\1/' | sort -nk1,1
 1 V(Cl8)                         2.121
 2 V(C1,H3)                       2.067
 3 V(Cl7)                         2.121
 4 V(Cl7)                         1.347
 5 V(C4,H6)                       2.067
 6 V(Cl8)                         1.347
 7 V(Cl8)                         0.918
 8 V(C1,Cl7)                      1.220
 9 V(C4,Cl8)                      1.220
10 V(Cl7)                         0.918
11 V(C1,C4)                       1.958
12 C(Cl8)                         7.668
13 C(Cl7)                         7.668
14 C(C1)                          2.087
15 C(C4)                          2.087
# 16 C(Cl8)                         2.267 removed
# 17 C(Cl7)                         2.267 removed
18 V(C1,H2)                       2.067
19 V(Cl8)                         2.122
20 V(Cl7)                         2.122
21 V(C4,H5)                       2.067

相关内容