AWK One Liner(一行野郎)
データ整形、ログ集計に役立つAWKのOne Linerを記載しました。
AWK本からの引用です。
1. 入力行の総数を印字
END { print NR }
2. 10行目の入力行を印字する
NR == 10
3. すべての入力行の最後の欄を印字する
{ print $NF }
4. 最後の行の最後の欄を印字する
{ field = $NF }
END { print field }
5. 4個より多い欄を持つすべての入力行を印字する
NF > 4
6. 最後の欄が4より大きいようなすべての入力行を印字する
$NF > 4
7. すべての入力行の欄の総数を印字する
{ nf = nf + NF }
END { print nf }
8. Bethを含む行の総数を印字する
/Beth/ { nlines = nlines + 1 }
END { print nlines }
9. 最も大きい第1欄とそれを含む行を印字する($1のどれかは正であると仮定する)
$1 > MAX { max = $1; maxline = $0 }
END { print max, maxline }
10. 少なくとも1つの欄を持つすべての行を印字する
NF > 0
11. 80文字以上の長さを持つすべての行を印字する
length($0) > 80
12. それぞれの行の欄の数とその行自体を印字する
{ print NF, $0 }
13. 任意の行の最初の2つの欄を逆順で印字する
{ print $2, $1 }
14. すべての行を最初の2つの欄を交換して印字する
{ temp = $1; $1 = $2; $2=temp; print }
15. すべての行を最初の欄を行番号に置き換えて印字する
{ $1 = NR; print }
16. すべての行を2つ目の欄を消去して印字する
{ $2 = ""; print }
17. すべての行の欄を逆順で印字する
{ for (i = NF; i > 0; i = i - 1)printf("%s", $i)
printf("\n")
}
18. すべての行の各欄の合計を印字する
{ sum = 0
for (i =1; i <= NF; i = i + 1) sum = sum + $i
print sum
}
19. すべての行のすべての欄を合計して、その値を印字する
{ for (i = 1; i <= NF; i = i + 1) sum = sum + $i }
END { print sum }
20. 各欄の値を絶対値に置き換えてからすべての行を印字する
{ for (i =1; i <= NF; i= i + 1) if ($i < 0) $i = -$i
print
}
参考書籍
プログラミング言語AWK (A.V.エイホ、P.J.ワインバーガー、B.W.カーニハン、足立 高徳(訳))