項目ごとの数を数える gawk スクリプト、ただし入力はソート済

a
a
a
b
c
c

というデータの場合に、a が 3 個、b が 1 個、c が 2 個、のように項目ごとの数を数える awk のイディオム。入力ファイルはソートしておく。とりあえず第一フィールドについてカウントするもの。

{
  if (prev != "" && prev != $1) {
    printout();
  }
  counter++;
  prev = $1;
}

END {
  printout();
}

function printout() {
  print prev, counter;
  counter = 0;
}

実行結果は

a 3
b 1
c 2

追記

ワンライナー用のも貼っておこう。コピペして使えるように。

awk '{if(p!=""&&p!=$1)v();c++;p=$1}END{v()}function v(){print p,c;c=0}'

追記 2009-11-26

ワンライナー的には関数を使わないのが正解かも。

awk '{if(p!=""&&p!=$1){print p,c;c=0};c++;p=$1}END{print p,c}'

追記 2009-12-06

コメントを受けてタイトルに「ただし入力はソート済」を追加した。