列による重複行の取得またはフィルタリング

列による重複行の取得またはフィルタリング

3つの列を持つファイルがありますが、3番目の列に重複行をインポートしたいと思います。たとえば、次のようになります。

AAA = 342  
BLABLABLA = 2  
BBBx2 = 23  
1+1 = 2  
KOKOKO= 5  
2x1 = 2  

出力は次のようになります。

BLABLABLA = 2  
1+1 = 2  
2x1 = 2  

sortを使ってみましたが、重複したuniq行を削除して印刷したいと思います。

答え1

興味がある限り最後列の場合は、sortsumを使用してこれを実行できますuniq

$ sort -k3n test.txt |  uniq  -f2 -D
1+1 = 2
2x1 = 2
BLABLABLA = 2

ここでソートオプションを使用する-k3nと、ファイルは3番目のフィールドから数字順にソートされますuniq

-f2   Skip the first two fields before checking for uniqueness
-D    Print all the repeated lines

残念ながら、一意性を確認するフィールドの数を制御することはできません。確認する文字数を指定するために使用できますが、-wこれは関心のあるフィールドが固定幅の場合にのみ役立ちます。

また、末尾のスペースに注意してください。一意性を確認するテキストに含まれます。

答え2

ユニークを使用してください。

uniq -f 3 <file name>

答え3

@riciの答えは正しいです。しかし、これは-DGNU拡張です。

これはawkソリューションです。一度実行されますが、前の行を保存します。

sort -k3n <file name> | awk 'a[$3]++{ if(a[$3]==2){ print b }; print $0}; {b=$0}'

答え4

gawk -F'= ' '{d[$2][a[$2]++]=$0} END{for (i in a) {if (a[i] > 1) for (j in d[i]) {print d[i][j]}}}'

説明する:

各行($ 0)に対して「=」で区切られた2番目のフィールド($ 2)を取得し、そのフィールドをハッシュ「a」のキーとして使用してフィールドの発生回数を計算し、そのフィールドを両方の次元として使用します。 。ディメンションハッシュ 'd'で、フィールドは現在の行($)の値を格納するための2番目のディメンションキーとしてハッシュ 'a'値を参照します。最後に、値が1より大きい(重複を意味する) 'a'のすべての要素を繰り返し、その値 'd'を印刷します。

注:この行はソートを必要としませんが、メモリを消費します。

関連情報