目的
業務で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
という風になると思い込んでいたので、ちょっと気づけなかったです。なぜなんだろう?内部的な実装によるものなのかなぁ。