awk芸
awk芸とは
awkだけでテキスト加工をなんでもやろうとする挑戦 今決めた
芸
code:echo
echo hello
# /proc/cpuinfo ファイルを指定しないと標準入力待ちになるので何でもいいからファイルを指定
awk 'END{print "hello"}' /proc/cpuinfo
code:cat
cat foo.txt
awk 1 foo.txt
code:tac
tac /proc/cpuinfo
awk '{mNR=$0} END{for(i=NR;1<i;i--){print mi}}' /proc/cpuinfo code:head
head -n 5
awk 'NR<=5'
code:tail
tail -n 5
awk '{mNR=$0} END{for(i=NR-4;i<=NR;i++){print mi}}' code:cut
cut -d , -f 1
awk -F , '{print $1}'
code:grep
grep foo
awk '$0~/foo/'
code:sed
code:sort
sort
awk '{mNR=$0} END{for(i=1;i<=NR;i++){for(j=1;j<NR;j++){if(NR<1)continue;x=mj-1;y=mj; if(y<x){tmp=x;x=y;y=tmp;mj-1=x;mj=y;}}}for(i=1;i<=NR;i++){print mi}}' code:seq
seq 32
awk 'END{for(i=1;i<=32;i++){print i}}' /proc/cpuinfo
code:nl
nl foo.txt
awk '{print NR, $0}' foo.txt
まじめに集計
サンプルデータ
code:data.csv
name,genre,score
tanaka,kokugo,95
tanaka,sugaku,80
tanaka,rika,70
suzuki,kokugo,80
suzuki,sugaku,20
suzuki,rika,44
yamada,kokugo,66
yamada,sugaku,71
yamada,rika,80
全体の平均を集計
awk -F , '1<NR{sum+=$3; cnt++} END{print cnt, sum, sum/cnt}' data.csv
9 606 67.3333
全科目の最小値と最大値を集計
awk -F , 'BEGIN{min=9999} 1<NR{if($3 < min)min=$3; if(max < $3)max=$3} END{print min, max}' data.csv
20 95
tanakaの平均点を集計
awk -F , '1<NR && $1~/tanaka/{sum+=$3; cnt++} END{print sum/cnt}' data.csv
81.6667
nameごとの平均値を集計
awk -F , '1<NR{sum[$1]+=$3; cnt[$1]++} END{for(k in sum){s=sum[k]; c=cnt[k]; print k, s, c, s/c}}' data.csv
tanaka 245 3 81.6667
yamada 217 3 72.3333
suzuki 144 3 48
genreごとの平均を集計
awk -F , '1<NR{sum[$2]+=$3; cnt[$2]++} END{for(k in sum){s=sum[k]; c=cnt[k]; print k, s, c, s/c}}' data.csv
sugaku 171 3 57
kokugo 241 3 80.3333
rika 194 3 64.6667