̃Gg[͂ĂȃubN}[Nɒlj

Unix :: コマンド / awk



コマンド説明
awkUNIX上で開発されたフィールド指向のテキスト処理スクリプト言語


条件式と演算

2行目と3行目を表示する (パイプ経由)

% cat hoge.txt | awk 'NR==2,NR==3 { print }'


2行目と3行目を表示する (ファイルから読み込む)

% awk 'NR==2,NR==3 { print }' < hoge.txt


条件分岐 (if else)

% grep 'needle' hoge.txt \
| awk '{if($2==OK) ok++; else ng++}; END {print ok; print ng}'

第2フィールドの「OK」をカウントし、同時に「OK以外」もカウントする。


演算子 && ||

% some_command | awk '{if($1==A && $2==B) print}'
% some_command | awk '{if($1==A || $2==B) print}'


第2フィールドが「1以上」の行のみ書き出す

% awk $2>=1{print $0} < hoge.txt > fuga.txt

 ⇒ $0 は行全体を表す

% awk $2>=1{print} < hoge.txt > fuga.txt

 ⇒ print の引数を省略した場合、デフォルトは行全体


第3,4,5フィールドを合計して「9以上」だったら、合計値と行全体を出力する

% grep 'needle' hoge.txt | awk '{sum=$3+$4+$5; if(sum>=9)print sum" "$0}'


第2フィールドの文字列の長さが「10」だったら出力する

% awk '{if(length($2)==10) print}' < less hoge.txt



正規表現

肯定の正規表現 (line ~ /regex/ )

% cal 2007 | awk '$1 ~ /J/'
      January               February               March
        July                 August              September


否定の正規表現 (line !~ /regex/ )

% cal 2007 | awk '$1 !~ /J/'
                             2007

Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6               1  2  3               1  2  3
 7  8  9 10 11 12 13   4  5  6  7  8  9 10   4  5  6  7  8  9 10
14 15 16 17 18 19 20  11 12 13 14 15 16 17  11 12 13 14 15 16 17
21 22 23 24 25 26 27  18 19 20 21 22 23 24  18 19 20 21 22 23 24
28 29 30 31           25 26 27 28           25 26 27 28 29 30 31

:
:



連想配列

% less hoge.txt
550     1
550     1
3000    1
3000    1
3000    1
10001   1
10002   1
10002   1
10002   1
10002   1
10003   1

% less hoge.txt \
| awk '{a[$1] += $2} END{for(key in a) print key"\t"a[key]}'
550     2
3000    3
10001   1
10002   4
10003   1



シェルの環境変数を参照する「ENVIRON」

% export _VAR=123
% less hoge.txt | awk '{if(ENVIRON["_VAR"]<=$1) print $0;}'



欠番がある数値リストの欠番を埋めて出力する

% less ketuban.txt
1
2
5
6
8
10

% less ketuban.txt | sort -n \
| awk '{if(a+1 < $1){for(i=a+1; i<=$1; i++) print i} else {print} a=$1}'
1
2
3
4
5
6
7
8
9
10

ちなみに、ワンライナーをインデントすると

awk '{
    if(a+1 < $1){
        for(i=a+1; i<=$1; i++) print i
    } else {
        print
    }
    a=$1
}'



unix/command/awk.txt