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)
您可以使用
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)