如何删除文件中的重复出现?

thu*_*nja 1 linux bash grep

我是bash编程的新手(grep/uniq/sort/etc ...),我在尝试从给定格式的文件中删除重复项时遇到问题

--
name: joe
tag: 123
--
name: mike
tag: 000
--
name: dave
tag: 123
--
name: loopy
tag: 123
--
Run Code Online (Sandbox Code Playgroud)

基本上我想要的是删除文件中具有相同标签号的重复项,如下所示:

--
name: joe
tag: 123
--
name: mike
tag: 000
--
Run Code Online (Sandbox Code Playgroud)

Tho*_*hor 5

这个任务非常适合awk.如果你有gawk或mawk可用,你可以通过适当地设置记录分隔符来完成它:

awk -v RS='--\n' -v ORS='--\n' '!h[$4]++' infile
Run Code Online (Sandbox Code Playgroud)

输出:

--
name: joe
tag: 123
--
name: mike
tag: 000
--
Run Code Online (Sandbox Code Playgroud)

这通过记住已经看到哪些标签(h[$4]++),即每个记录中的第四个元素来工作.!增量前面的bang()确保条件仅在h[$4]为零时才为真,因此{ print $0 }仅在第一次看到标记时调用默认规则().

略短的版本:

awk '!h[$4]++' RS='--\n' ORS='--\n' infile
Run Code Online (Sandbox Code Playgroud)

编辑 - 处理名称字段包含空格的记录

如果名称字段包含空格,则字段数会有所不同.你可以通过不同的字段拆分来处理这个问题:

awk '!h[$4]++' RS='--\n' ORS='--\n' FS='\n| *: *' infile
Run Code Online (Sandbox Code Playgroud)