sort
と組み合わせに加えて、独自の行を印刷するためのより良い解決策がありますかuniq
?
答え1
すべての同じ行のみの順序に関係なく印刷するには、次の手順を実行します。
sort -u
順序に関係なく一意の行だけを印刷するには、次の手順を実行します。
sort | uniq -u
各同じ行を最初の出現順に一度だけ印刷するには:(各行にまだ表示されていない場合は、行を印刷してから、いずれの場合も表示されたカウンタをインクリメントします。)
awk '!seen[$0] {print}
{++seen[$0]}'
最初に発生した順序で一意の行のみを印刷するには:(各行を に記録し、最初の発生であっても記録しseen
ますlines
。
awk '!seen[$0]++ {lines[i++]=$0}
END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}'
答え2
一部(ほとんど?)バージョンには、その部分を直接実行するフラグがsort
あります。ただし、実装によっては、いくつかの行長制限があるかもしれませんが、すでに一般的な制限があります。-u
uniq
sort|uniq
答え3
答えに記載されている最後の部分は次のとおりです。ユニークなライン印刷@Gilles この質問に対する答えとして、2つのハッシュを使用する必要をなくそうと努力しています。
このソリューションは動作します。最初に表示される順序で一意の行のみを印刷します。
awk '{counter[$0]++} END {for (line in counter) if (counter[line]==1) print line}'
ここで、「カウンタ」は、以前に処理された行と同様の各行の数を格納します。
最後に、カウンタ値が1の行のみを印刷します。
答え4
Perlはあなたに適していますか?重複した項目が隣接していない場合でも、行の元の順序を維持します。 Pythonやawk
。
while (<>) {
print if $lines{$_}++ == 0;
}
に短縮することができる
perl -ne 'print unless $lines{$_}++;'
与えられた入力ファイル:
abc
def
abc
ghi
abc
def
abc
ghi
jkl
次の出力が生成されます。
abc
def
ghi
jkl