uniqが十分にユニークではないのはなぜですか? uniq --uniqueはどうですか?

uniqが十分にユニークではないのはなぜですか? uniq --uniqueはどうですか?

次の任意ファイルのコマンドは次のとおりです。ペーストビン:

wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258

マニュアルページでは、この-uフラグの機能は明確ではありません。どんな提案がありますか?

答え1

uniqwithは-u重複した行をスキップします。したがって:

$ printf "%s\n" 1 1 2 3 | uniq
1
2
3
$ printf "%s\n" 1 1 2 3 | uniq -u
2
3

通常、uniq行は最大1回印刷されます(入力がソートされていると仮定)。このオプションは実際に実際の行を印刷します。ユニーク(再現されませんでした)。

答え2

簡潔なバージョン:

  • uniq、なしで-u、各行を作成します。出力ユニーク。
  • uniq -uすべてのユニークラインのみを印刷入力から

少し長いバージョン:

uniq繰り返し行を含むファイルを処理するために使用され、これらの行が入力に連続して表示される場合にのみ使用されます。したがって、その目的のために、ユニーク行はすぐにコピーされない行です。

uniq短期記憶は非常に限られています。前の行ではない限り、入力に前の行が表示されたかどうかは決して覚えていませuniqsort

一連の繰り返し行が表示されると、パラメータなしでuniq印刷-uされます。一つラインのコピー。 (各出力ラインを作成します。ユニーク)。

パラメータを渡すと-u印刷されます。若いラインコピー - 冗長実行は出力から省略されます。

答え3

独自のPOSIX仕様非常に明確に説明されています。

-u
    Suppress the writing of lines that are repeated in the input.

-umakeオプションはuniq重複した行を印刷しません。

ほとんどのuniq実装ではバイト比較を使用しますが、GNUはuniq照合順序を使用して冗長行をフィルタリングします。したがって、en_US.UTF-8次の一部のロケールでは、誤った結果が発生する可能性があります。

$ printf '%b\n' '\U2460' '\U2461' | uniq

どの行も提供されませ-uん。

$ printf '%b\n' '\U2460' '\U2461' | uniq -u
<blank>

したがって、Cバイト比較を実行するにはロケールを設定する必要があります。

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C uniq

答え4

通常:

echo "a b a b c c c" | tr ' ' '\n'
a
b
a
b
c
c
c

uniq:2つの連続した重複行がありません。

echo "a b a b c c c" | tr ' ' '\n' | uniq
a
b
a
b
c

ソート済み

echo "a b a b c c c" | tr ' ' '\n' | sort
a
a
b
b
c
c
c

sort -u:2行は繰り返されません。

echo "a b a b c c c" | tr ' ' '\n' | sort -u
a
b
c

ソート/固有性:すべて異なる

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq
a
b
c

別個の発生回数の計算

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq -c
2 a
2 b
3 c

一意の行のみ(最初にソートしない)

echo "a b a b c c c" | tr ' ' '\n' | uniq -u
a
b
a
b

一意の行のみ(ソート後)

echo "a b a b c c c Z" | tr ' ' '\n' | sort | uniq -u
Z

uniq -d:グループごとに1つずつ重複した行のみを印刷します。

echo "a b a b c c c" | tr ' ' '\n' | uniq -d
c

..大丈夫です。

echo "a b a b c c c" | tr ' ' '\n' | uniq -dc
3 c

関連情報