awkコマンドでパターン検索、テキスト処理をする②
はじめに
くーばねてすをやっつけるためにLinuxさんと仲良くさせていただいているが、Linuxさんには超大量のテキストがあって、検索するだけではなくたくさんテキスト編集処理もする。
今回はテキストを便利に編集できるように非対話型エディタのawkコマンドを勉強しようと思う。
sedコマンドよりさらに強いやつらしい。
awkコマンドでパターン検索、テキスト処理をする①の続き!
概要
awkコマンドの
■アクションの省略
■スコア編集をしてみる
をまとめた!
■アクションの省略
$ awk 'パターン{アクション}' ファイル
でアクションを省略するとどうなるのだろうか。
$ ls -l /usr/bin | awk '$9 ~/^cp/'
-rwxr-xr-x 1 root root 146880 Jan 23 2020 cp
-rwxr-xr-x 1 root root 141824 Oct 15 20:53 cpio
-rwxr-xr-x 1 root root 67920 Dec 16 22:47 cpupower
アクションを指定しないと、レコード(行まるごと)がそのままでてきた!
...まあそうだよね(@_@)
アクションを省略すると
{print $0}
が指定される。
$0とは、行まるごとを指すようだ。ちなみにアクションで引数を省略すると自動的に$0が指定される。
awk '$9 ~ /^cp/'
awk '$9 ~ /^cp/{print}'
awk '$9 ~ /^cp/{print $0}'
■スコア編集をしてみる
今回はカンマ区切りのcsvファイルを編集する。
1,suidou,100
2,denki,48
3,gasu,22
4,gesui,78
まって(>_<)あの苦手な区切り文字だ!
どうすれば区切り文字を認識するの?awkコマンドでパターン検索、テキスト処理をする①でできなかったな...
$ awk -F , '{print}' score.csv
1 suidou 100
2 denki 48
3 gasu 22
4 gesui 78
-Fオプションか!
$ awk -F , '{print $NF}' score.csv
100
48
22
78
OK('◇')!
$ awk -F , '{sum = sum + $NF} END{print sum}' score.csv
248
合計値を表示するのには
{sum = sum + 行指定}
で指定した行を合計でたしていき、
END{print sum}
で最後にsumの結果を表示するそうだ。
$ awk -F , '{sum = sum + $NF} END{print "Average:",sum/NR}' score.csv
Average: 62
めちゃくちゃ難しいけど、
{sum = sum + $NF} で
合計値をだしてから
END{print "Average:",sum/NR}で
ENDで最後に"Average:"という言葉を出力して
sum/NRで合計値をNR(処理したレコードの総数(行数))で/(割って)、
出力せよ!
って意味なんだと思う(@_@)
せっかく頑張って作ったコマンドはawkファイルに保存しておこう。
保存したファイルは-fオプションで出力することができる。
$ vim average.awk
$ cat average.awk
{sum = sum + $NF} END{print "Average:",sum/NR}
$ awk -F , -f average.awk score.csv
Average: 62
はぁはぁ!(@_@)
まとめ
まって!awkコマンドでパターン検索、テキスト処理をする①でできなかったやつ-Fオプションでできるじゃん!
$ cat /etc/passwd | awk -F : '{print $4,$5}'
root 0
bin 1
daemon 2
adm 4
lp 7
sync 0
shutdown 0
できた!(>_<)はぁはぁ!
エクセルを作ったひと、ほんとにすごいと実感した!
Discussion