我是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)
这个任务非常适合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)
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |