🐕

awkコマンドでパターン検索、テキスト処理をする②

2021/01/08に公開

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くさせていただいているが、Linuxさんには超大量のテキストがあって、検索するだけではなくたくさんテキスト編集処理もする。
今回はテキストを便利に編集できるように非対話型エディタのawkコマンドを勉強しようと思う。
sedコマンドよりさらに強いやつらしい。
awkコマンドでパターン検索、テキスト処理をする①の続き!

概要

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ファイルを編集する。

ゲームの結果のscore.csvファイル
1,suidou,100
2,denki,48
3,gasu,22
4,gesui,78

まって(>_<)あの苦手な区切り文字だ!
どうすれば区切り文字を認識するの?awkコマンドでパターン検索、テキスト処理をする①でできなかったな...

awkコマンドで区切り文字を指定するには-Fオプションで区切り文字を指定
$ 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コマンドのsumアクションで点数の合計点をだして合計点を最後にだす
$  awk -F , '{sum = sum + $NF} END{print sum}' score.csv
248

合計値を表示するのには
{sum = sum + 行指定}
で指定した行を合計でたしていき、
END{print sum}
で最後にsumの結果を表示するそうだ。

平均値を計算するには、合計値をだしてからNR(レコードの数)で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