ターミナル上で指定した列の値の件数に応じて出力させる
Pocket

ターミナル上で、特定の列の値の件数を集計して、その集計した数が指定した値の行だけを出力させたい事がある。
…のだけど、調べたところ楽に一発で取得するようなコマンドが無いみたいなので、一応残しておく。

いろいろとやり方は有ると思うけど、以下のように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]}
    }
  }
'
Sponsored Links

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等でコードを書いてやるのが一番はやいのではないかと思う。

Pocket

Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*