ターミナル上で、特定の列の値の件数を集計して、その集計した数が指定した値の行だけを出力させたい事がある。 …のだけど、調べたところ楽に一発で取得するようなコマンドが無いみたいなので、一応残しておく。
いろいろとやり方は有ると思うけど、以下のようにawkで処理を書いてやるほうが楽だろう。 以下の例では、3列目に2個同じ値がある行のみを出力している。
command ... | awk '
{line[NR]=$0;count[$3]++}
END{
for(i=1;i<NR;i++){
split(line[i], column, FS);
if (count[column[3]]==2){print line[i]}
}
}
'
blacknon@BS-PUB-UBUNTU-01:~$ cat test.txt
1 z 9
2 x 4
3 y 3
4 z 9
5 y 9
6 z 3
7 z 3
8 y 9
9 x 3
10 y 0
11 y 2
12 y 3
13 x 6
14 y 5
15 z 8
16 y 8
17 x 2
18 x 1
19 x 3
20 z 6
21 z 5
22 y 0
23 x 7
24 y 9
25 z 4
26 z 5
27 x 9
28 x 3
29 z 0
30 y 1
blacknon@BS-PUB-UBUNTU-01:~$ cat test.txt | awk '
{line[NR]=$0;count[$3]++}
END{
for(i=1;i<NR;i++){
split(line[i], column, FS);
if (count[column[3]]==2){print line[i]}
}
}
'
2 x 4
11 y 2
13 x 6
15 z 8
16 y 8
17 x 2
18 x 1
20 z 6
25 z 4
blacknon@BS-PUB-UBUNTU-01:~$
uniqにフィールドセパレータやフィールドの指定方法があればもっと簡単にできるのかもしれないが、そういう機能は無いようなので、こういう感じでawkやperl等でコードを書いてやるのが一番はやいのではないかと思う。