1
1

More than 3 years have passed since last update.

awkのコマンド例

Last updated at Posted at 2019-08-05

目的

業務でawkをよく書くので、コピペするためにここに保存しておく。ある意味、「生きた」コマンド達です笑

バイブル

なるべく書かないawkの使い方
awkコマンドの基本

具体例

空白を無くしつつ、カンマで区切る

cat /tmp/hoge | awk -F' ,' '{{sum = ""} {for(i=1; i <= NF; i++) {sub(" ", "",$i); sum = sum "'\''" $i "'\''" ","}} {print sum} }'

置換しつつ、テキストファイルに出力

cat hoge.csv | awk '{gsub(/([".]|E9)/, "", $0); print $0}' > fuga.csv

最初の行に文字列を挿入して、置換して、テキストファイルに出力

cat hoge.csv | awk 'BEGIN{print("ITEM_ID,LABEL")} {sub(/.$/, "", $0); print $0}' > fuga.csv

全行をカンマをつけつつ、結合して出力

cat /tmp/hoge | awk 'BEGIN{reduced_text = ""} {reduced_text = reduced_text $0 ",";} END{print(reduced_text)}'

改行文字がcrlfだった時

tr -d '\r' < ~/Downloads/hoge.csv | awk 'BEGIN{reduced_text = ""} { reduced_text = reduced_text $0 ",";} END{print(reduced_text)}'

別解
cat ~/Downloads/hoge.csv | awk 'BEGIN{RS="\r\n"; ORS=","} /../ {print $1}'

""をEMPTYという文字列に置換しながら、ダブルクオテーションと最後の方にある|、スペースを空文字にする

cat hoge.csv | awk -F',' '{if($2 == "\"\"") {$2 = ",EMPTY"} {gsub(/(\|.$|"| )/, "", $0); print $0}}'

.とE9と"を空文字に置換

cat hoge.csv | awk '{gsub(/([".]|E9)/, "", $0); print $0}'

1行目に文字列を挿入

cat hoge.csv | awk 'BEGIN{print("USER_ID,ITEM_ID,TIMESTAMP")} {print $0}'

全ての値に対して""をEMPTYという文字列に置換しながら、ダブルクオテーションと最後の方にある|、スペースを空文字にする

cat hoge.csv | awk -F',' -v 'OFS=,' '{for(i = 1; i <=NF; i++){if($i == "\"\"") {$i = "EMPTY";} gsub(/("| |\|.$)/, "", $i)} {print $0}}'

一行目は無視して、ダブルクオテーションを取り除きつつ、文字列連結する。

cat hoge.csv | awk 'BEGIN{reduced_text=""} {gsub(/(")/, "", $0);} NR!=1{reduced_text= reduced_text $0 ","} END{print reduced_text}'

.とE9と"を空文字に置換しつつ、3つめのカラムを10文字になるように0埋めする

cat hoge.csv | awk -F',' '{gsub(/([".]|E9)/, "", $0); str_length = length($3); if(NR!=1 && str_length < 10){ for(i = 0; i < (10 - str_length); i++){$3 = $3 "0"; } } {gsub(/ /, ",", $0); print $0}}'
while(i++)`はiの値が実行時に行を渡って保持される。そちらの方がいい時はwhileを使おう。

各行を'(シングルクオート)で囲いながら、,(カンマ)をつけていく

cat /tmp/hoge | awk 'BEGIN{reduced_text = ""} {reduced_text = reduced_text "," "'\''" $0 "'\''"} END{print(reduced_text)}'

改行文字をから文字に置換

cat /tmp/fuga | awk '{gsub(/(\\n)/, "", $0); print $0}'

つまづくポイント

  • $1 = $1 "hoge"のような演算を行うと$0の値が変わる
Earth:Development tomitakazuya$ echo 1,2,3 | awk -F',' '{print $0}'
1,2,3
Earth:Development tomitakazuya$ echo 1,2,3 | awk -F',' '{$1 = $1 "hoge"; print $0}'
1hoge 2 3

最後の結果は1hoge,2,3という風になると思い込んでいたので、ちょっと気づけなかったです。なぜなんだろう?内部的な実装によるものなのかなぁ。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1