次の任意ファイルのコマンドは次のとおりです。ペーストビン:
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
uniq
withは-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
短期記憶は非常に限られています。前の行ではない限り、入力に前の行が表示されたかどうかは決して覚えていませuniq
んsort
。
一連の繰り返し行が表示されると、パラメータなしでuniq
印刷-u
されます。一つラインのコピー。 (各出力ラインを作成します。ユニーク)。
パラメータを渡すと-u
印刷されます。若いラインコピー - 冗長実行は出力から省略されます。
答え3
独自のPOSIX仕様非常に明確に説明されています。
-u
Suppress the writing of lines that are repeated in the input.
-u
makeオプションは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