「uniq --unique」がすべての重複行を削除しないのはなぜですか?

「uniq --unique」がすべての重複行を削除しないのはなぜですか?

走る

printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | uniq --unique

印刷

foo
bar
foo
lol
foo

なぜfoo3回印刷されたのですか?uniq --unique削除してはいけませんか?

lolまた、すべての重複項目が削除されたように見えることも注目に値します。なぜ?重複したアイテムは削除されますが、金持ち繰り返す?

答え1

uniqman uniq入力を削除するには、入力をソートする必要があります。みんな重複行:

説明する

INPUT(または標準入力)から隣接する一致ラインをフィルタリングし、OUTPUT(または標準出力)に書き込みます。

上記のように、フィルタリングのみが行われます。近い一致する行。これがlolsが削除された理由です。したがって、データは次に渡される前にソートされます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質問--uniqueに示すように使用してください。

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

ただし、すべての場合にソートが必要です。

答え2

fooなぜまだリストにあるのだろうか?uniq隣接する重複行のみを削除し、隣接する重複行を単一行に「圧縮」します。 GNUを使用すると-u(または--uniqueGNUを使用するとuniq)、隣接する重複行がある行も削除されます。

あなたの例では、3行のどれもfoo他の行に隣接していませんfoo。それが彼らが輸出される理由です。

削除された行はlol内容がある他の行に隣接しているため削除されますlol。この意味では、最後のlol行は繰り返されないので保持されます。

関連情報