awk や sed を使ってテキスト整形するときにいつも使い方を忘れるので、メモします。このエントリはawkです。
awk コマンド の使い方
記載内容は独断と偏見で偏ってます。さらに場合によっては、grepとかsedを併用したほうがやりやすかったりわかりやすかったりすることもありますが、あくまでawkのレシピとして。あと、このページではカンマ区切りのデータを扱ってますが、区切り文字を指定しない場合、awkはスペースを区切りと認識します。
まず、使用するテストデータとして以下。
1 2 3 4 5 6 |
# cat test.csv # NAME_LIST Name,Age,Country json,23,America yamada,31,Japan adam,19,France |
空白の2カラム目を追加
強引ですが、1カラム目($1)をカンマ付きで置換することで強制的にカラムを追加したこととなります。
1 2 3 4 5 6 |
# awk -F',' 'BEGIN {OFS=","} { $1=$1"," ; print }' test.csv # NAME_LIST, Name,,Age,Country json,,23,America yamada,,31,Japan adam,,19,France |
上書き
上書きする場合は、"-i inplace" オプションを使用します。
1 2 3 4 5 6 7 |
# awk -F',' -i inplace 'BEGIN{OFS=","} { $1=$1"," ; print }' test.csv # cat test.csv # NAME_LIST, Name,,Age,Country json,,23,America yamada,,31,Japan adam,,19,France |
この上書きオプションは、awk のバージョンが 4.1.0 以上 である必要があります。CentOS7.2の場合、デフォルトの awk のバージョンは 4.0.2 だったのでアップデートする必要があります。アップデートする方法は以下のエントリにアップしてます。
1カラム目と2カラム目をつなげて、2カラム目を削除
1 2 3 4 5 6 |
# awk '{ FS="," ; OFS="," ; $1=$1$2 ; $2="" ; print }' test.csv #NAME_LIST, NameAge,,Country json23,,America yamada31,,Japan adam19,,France |
3行目のみ表示(sedでもできる)
1 2 3 4 5 |
# awk 'NR==3{ print $0 }' test.csv json,23,America # sed -n 3p test.csv json,23,America |
3行目をカラムごとに置換
1 2 3 4 5 6 7 8 |
# awk 'BEGIN { FS=",";OFS="," } NR==3 { gsub ("json","PSON",$1) ; print }' test.csv PSON,23,America # awk 'BEGIN { FS=",";OFS="," } NR==3 { gsub ("23","53",$2) ; print }' test.csv json,53,America # awk 'BEGIN { FS=",";OFS="," } NR==3 { gsub ("Ame","Muchi",$3) ; print }' test.csv json,23,Muchirica |
3行目以降の2カラム目にデータを挿入
1 2 3 |
# awk 'BEGIN { FS=",";OFS="," } NR>3 { $2="ADD_DATA" ; print }' test.csv yamada,ADD_DATA,Japan adam,ADD_DATA,France |
以上。
↓↓↓ 持っていると便利な一冊。