awkでcsvの最初の数列を削除する
1 2 3 4 |
1,hoge,red,dog 2,fuga,blue,cat 3,foo,green,fish 4,bar,yellow,bird |
というcsvデータの最初の数カラムを次のように削除したい場合がある
1 2 3 4 |
red,dog blue,cat green,fish yellow,bird |
カラム数が決まっている場合はcutで範囲指定してやればよいが、カラム数が決まっていなかったりどうしてもawkを使いたい場合は困る。そこでhttp://www.dollpaper.com/tips/257 を参考に(と言ってもOFSを事前に設定するようにしただけだが)
1 |
awk -F, -v OFS="," '{for(i=2;i<NF;i++){printf("%s%s",$i,OFS)}print $NF}' data.csv |
これで期待通りの動作するが、何故動作するのかわからなかったのでメモ
動作説明
注:awkは入力を1行ずつ処理するという事を理解しておく
awkの詳しい説明: http://d.hatena.ne.jp/zariganitosh/20131209/minimum_awk
区切り文字設定
入力区切り文字を「,」、出力区切り文字を「,」に設定
1 |
-F, -v OFS="," |
出力の解釈
NFには今処理している行のフィールド総数が入っている(awkの組み込み変数)、つまりNFは4。これで条件が満たされる限り中括弧内を繰り返す。
1 |
for(i=3;i<NF;i++) |
1つのフィールドを表示する。awkでは $数値 とすると今処理している行の指定フィールド内容として処理される。つまり1行目処理時の$3は hoge。printfはC言語の仕様と同様。
1 |
printf("%s%s",$i,OFS=",") |
for文の条件でNFより小さいフィールドまでしか表示されないので、ループ終了後に最終フィールドを表示する。
1 |
print $NF |
コメントを残す