从文件中删除重复行但保留 1 次出现

从文件中删除重复行但保留 1 次出现

我希望从文件中删除重复的行,但在文件中保留 1 次出现。

文件示例:

this is a string
test line
test line 2
this is a string

从上面的示例中,我想删除 1 次出现的“这是一个字符串”。

最好的方法来做到这一点?

答案1

演示文件stuff.txt包含:

one
two
three
one
two
four
five

假设您不介意行已排序,则从文件中删除重复行

$ sort -u stuff.txt 
five
four
one
three
two

说明:发送到 sort 的 u 标志表示对文件的行进行排序并强制唯一。

从文件中删除重复行,保留原始顺序,保留第一行:

$ cat -n stuff.txt | sort -uk2 | sort -nk1 | cut -f2-
one
two
three
four
five

说明:传递给 cat 的 n 标志将行号附加到每行的左侧,加上空格,然后第一个排序表示按唯一排序,但仅在第一个单词之后,第二个排序命令表示使用我们在步骤 1 中存储的行号只好按原来的顺序,最后砍掉了第一个字。

从文件中删除重复行,保留顺序,保留最后。

tac stuff.txt > stuff2.txt; cat -n stuff2.txt | sort -uk2 | sort -nk1 | cut -f2- > stuff3.txt; tac stuff3.txt > stuff4.txt; cat stuff4.txt
three
one
two
four
five

解释:与之前相同,但 tac 反转文件,达到所需的结果。

答案2

由于删除除最后一个出现之外的所有内容与删除除第一个以外的所有内容相反,因此还有以下解决方案:

tac file | awk '! seen[$0]++' | tac

tac反转文件中的行,并且awk仅输出第一次出现的重复行。

答案3

根据您的评论,您希望结果是相同的输出文件,而不必创建另一个输出或附加到新文件中,您可以使用以下命令:

例子:

gawk -i inplace '!a[$0]++' $file

答案4

如果你使用vim,可以尝试以下代码:

g/./if(temp == getline('.')) | let temp = getline('.') | else | :norm dd | endif

相关内容