删除具有相同首行的行组(第一次出现除外)

删除具有相同首行的行组(第一次出现除外)

这可能是几个问题合而为一,但这个问题让我陷入困境。我有一个文本文件,其中包含由空行分隔的四行分组。每个分组的第一行都以“>”符号开头。我想删除具有相同第一行的所有分组实例,但分组的第一个实例除外。首先想到的是使用 sed 但想不出一个好的实现方法。将不胜感激任何帮助!

输入:

>abc1234.54321
linea1
lineaa1
lineaaa1

>def56789034
linea1
lineaa1
lineaaa1

>abc1234.54321
linea2
lineaa2
lineaaa2

>def56789034
linea2
lineaa2
lineaaa2

预期输出:

>abc1234.54321
linea1
lineaa1
lineaaa1

>def56789034
linea1
lineaa1
lineaaa1

答案1

如果您不介意可能存在额外的尾随空白行,那么 paragrapgh 模式下的 Awk 将使您接近:

$ awk -vRS= '!seen[$1]++' ORS='\n\n' input
>abc1234.54321
linea1
lineaa1
lineaaa1

>def56789034
linea1
lineaa1
lineaaa1

取消设置记录分隔符 ( RS=) 会导致 Awk 将每组空行分隔行视为单个记录;然后我们使用第一个字段上的关联数组的值$1来跟踪我们之前是否见过带有该键的记录 - 如果没有(即为!seen[$1]真)则打印它。

相关内容