走る
printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | uniq --unique
印刷
foo
bar
foo
lol
foo
なぜfoo
3回印刷されたのですか?uniq --unique
削除してはいけませんか?
lol
また、すべての重複項目が削除されたように見えることも注目に値します。なぜ?笑重複したアイテムは削除されますが、金持ち繰り返す?
答え1
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
質問--unique
に示すように使用してください。
$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort | uniq -u
bar
ただし、すべての場合にソートが必要です。
答え2
foo
なぜまだリストにあるのだろうか?uniq
隣接する重複行のみを削除し、隣接する重複行を単一行に「圧縮」します。 GNUを使用すると-u
(または--unique
GNUを使用するとuniq
)、隣接する重複行がある行も削除されます。
あなたの例では、3行のどれもfoo
他の行に隣接していませんfoo
。それが彼らが輸出される理由です。
削除された行はlol
内容がある他の行に隣接しているため削除されますlol
。この意味では、最後のlol
行は繰り返されないので保持されます。