Uniq
為什麼“uniq –unique”不刪除所有重複的行?
跑步
printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | uniq --unique
印刷
foo bar foo lol foo
為什麼要
foo
列印三遍?不應該uniq --unique
刪除它們嗎?此外,值得注意的是,似乎所有重複項
lol
都已刪除。為什麼刪除了lol重複項,但沒有刪除foo重複項?
uniq``man uniq
如果要刪除所有重複行,則需要對輸入進行排序(從):描述
從 INPUT(或標準輸入)過濾相鄰的匹配行,寫入 OUTPUT(或標準輸出)。
正如你在上面看到的,它只過濾相鄰的匹配行。這就是
lol
刪除 s 的原因。因此,在傳遞給之前對您的數據進行排序uniq
:$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort | uniq bar foo lol
或者,使用 GNU
sort
,跳過uniq
:$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort --unique bar foo lol
最後,如果您想完全刪除多次出現的行(而不是保留一份副本,這是預設行為),請在您的問題中使用
uniq -u
or :--unique
$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort | uniq -u bar
然而,在所有情況下,排序都是必要的。