Uniq

為什麼“uniq –unique”不刪除所有重複的行?

  • July 16, 2021

跑步

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 -uor :--unique

$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort | uniq -u
bar

然而,在所有情況下,排序都是必要的。

引用自:https://unix.stackexchange.com/questions/658655