![Linux 命令删除重复的行但保留第一个出现的行](https://linux22.com/image/1562683/Linux%20%E5%91%BD%E4%BB%A4%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E7%9A%84%E8%A1%8C%E4%BD%86%E4%BF%9D%E7%95%99%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%87%BA%E7%8E%B0%E7%9A%84%E8%A1%8C.png)
我有一个文本文件。每行包含一个字符串。有些字符串是重复的。我想删除重复项,但我想保留第一次出现的字符串。例如:
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
来实现这一点,但它与使用两个tac
s 一样简单。
答案3
答案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;"
}
}'