仅当重复的行与模式匹配时才删除它们

Ice*_*can 4 unix shell scripting awk sed

这个问题有一个很好的答案,说您可以用来awk '!seen[$0]++' file.txt从文件中删除非连续的重复行。仅当匹配模式时,如何才能从文件中删除非连续重复行?例如,仅当它们包含字符串“ #####”时

输入示例

deleteme.txt ##########
1219:                            'PCM BE PTP'
deleteme.txt ##########
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
deleteme2.txt ##########
1222:                          , 'PCM BE PTP UT'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
deleteme2.txt ##########
1223:                          , 'PCM BE PTP'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
deleteme2.txt ##########
1225:                          , 'PCM FE/MID PTP'
Run Code Online (Sandbox Code Playgroud)

所需的输出

deleteme.txt ##########
1219:                            'PCM BE PTP'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
deleteme2.txt ##########
1222:                          , 'PCM BE PTP UT'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
1223:                          , 'PCM BE PTP'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
1225:                          , 'PCM FE/MID PTP'
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 6

您可以使用

awk '!/#####/ || !seen[$0]++'
Run Code Online (Sandbox Code Playgroud)

或者,如Ed Morton所建议,是同义词

awk '!(/#####/ && seen[$0]++)'
Run Code Online (Sandbox Code Playgroud)

在这里,!seen[$0]++与往常一样,它将删除所有重复的行。的!/#####/部分相匹配包含一个线#####图案和否定匹配。与这两种模式结合使用||将删除其中所有具有#####模式的重复行。

观看在线awk演示

s="deleteme.txt ##########
1219:                            'PCM BE PTP'
deleteme.txt ##########
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
deleteme2.txt ##########
1222:                          , 'PCM BE PTP UT'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
deleteme2.txt ##########
1223  #####:                          , 'PCM BE PTP'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
deleteme2.txt ##########
1225:                          , 'PCM FE/MID PTP'"
awk '!/#####/ || !seen[$0]++' <<< "$s"
Run Code Online (Sandbox Code Playgroud)

输出:

deleteme.txt ##########
1219:                            'PCM BE PTP'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
deleteme2.txt ##########
1222:                          , 'PCM BE PTP UT'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
1223  #####:                          , 'PCM BE PTP'
1221:                          , 'PCM FE/MID PTP UT','PCM IA 1 PTP'
1225:                          , 'PCM FE/MID PTP'
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言`awk'!(/ ##### / &amp;&amp; seen [$ 0] ++)'`更加清晰。 (3认同)