Linux 命令删除重复的行但保留第一个出现的行

Linux 命令删除重复的行但保留第一个出现的行

我有一个文本文件。每行包含一个字符串。有些字符串是重复的。我想删除重复项,但我想保留第一次出现的字符串。例如:

line1
line1
line2
line3
line4
line3
line5

应该

line1
line2
line3
line4
line5

我试过了:sort file1 | uniq -u > file2但这没有帮助。它删除了所有重复的字符串,而我希望第一个出现的内容存在。我不需要排序。只需在新行中删除字符串的精确重复,同时保持其他所有内容不变。

答案1

如果你允许排序,那么这将有效:

sort | uniq

-u是你的烦恼的根源,因为(从man 1 uniq):

-u--unique
仅打印唯一行

默认情况下:

如果没有选项,匹配的行将合并到第一次出现的行。

答案2

如果你想在保留第一次出现的情况下进行重复数据删除,你可以这样做

awk '!visited[$0]++' "$your_hist_file" > "$your_new_hist_file"

如果你想在保留最后一次出现内容的同时进行重复数据删除,你可以这样做

tac "$your_hist_file" | awk '!visited[$0]++' | tac > "$your_new_hist_file"

您也可以使用一个awk命令和 notac来实现这一点,但它与使用两个tacs 一样简单。

答案3

打印独特线条的专用工具没有排序:

  1. uq

  2. unique

也可以看看:如何无需对数据进行排序即可获得唯一的结果?Unix:删除重复的行而不进行排序

答案4

sort file1 |
awk '{
if (!visited[$1])
{
  print $0;
  visited[$1]=1;
} else {
 print "print this only to check that skip not desired lines $0;"
}
}'

相关内容