背景・目的
- 同じタイプのファイルを一つのファイルにマージしたかった
- しかし両方ともにカラムがあったので単純なリダイレクトができなかった
- パッとワンライナーでやりたかった
コマンド
$ awk 'FNR!=1 || NR==1 { print }' input1.csv input2.csv
ざっくり解説
-
FNR!=1 || NR==1
の結果を判定し、真の場合に後続のprint
を実行する -
FNR
はファイルごとの行数を表す -
NR
は読み込んだデータ全体の行数を表す - つまり、
FNR!=1
で各ファイルの1行目(ヘッダー)は除外される。しかし、or条件でNR==1
一番最初の行(1つ目のヘッダー)だけ許容されているのでヘッダー行を最初に一度だけ出力することができる
補足
- 以下のやり方もできるよう。条件を追加するなどの拡張しやすいのは以下。
# 判定で真の行はnextでスキップしている
# それ以外は1で出力している
$ awk 'FNR==1 && NR!=1 { next } 1' input1.csv input2.csv
- マージするだけでなくデータをソートしたい場合は以下のようにコマンドループを使用すればいけるよう
{
head -n 1 input1.csv
tail -n +2 -q input1.csv input2.csv input3.csv | sort
} > merged.csv