カレントディレクトリ内にあるCSVファイルをマージします。
各CSVにヘッダが無い場合
cat *.csv
```
ワイルドカード`*`でファイル名を展開し、`cat`で結合して出力します。たとえばディレクトリ内のCSVファイルが`1.csv`、`2.csv`、`3.csv`ならば、`cat 1.csv 2.csv 3.csv`と同じ結果になります。ファイルに出力する場合は、
````bash
cat *.csv > result
のようにリダイレクトすれば、result
に出力されます。
各CSVにヘッダがある場合
各CSVにヘッダがある場合は、1行目を除いてマージします。
find -name "*.csv" -exec sed -e '1d' {} \;
find -name [pattern]
は、カレントディレクトリ内のファイル名が[pattern]
にマッチするファイルの一覧を取得します。find
コマンドに-exec
オプションをつけると、マッチした各々のファイルに対して、引数で与えたコマンドを実行します。引数内の{}
はマッチしたファイル名に変換されて実行されます。たとえば、1.csv
、2.csv
、3.csv
がマッチしたとすると、sed -e '1d' 1.csv
、sed -e '1d' 2.csv
、sed -e '1d' 3.csv
が各々実行されます。最後の;
は-exec
オプションの引数の終わりを意味しますが、シェルの構文と解釈されないよう、\;
とエスケープしています。
sed
は文字列の抽出や置換をするコマンドです。sed -d '[N]d' [file]
で、[file]
のN行目を除いて出力します。
また、次のように書くこともできます。
find -name "*.csv" | xargs -n 1 sed -e '1d'
xargs [command]
は、標準入力を[command]
の引数に渡します。-n
オプションは、一度にコマンドに渡す引数の数を指定します。上のコマンドでは、たとえば標準入力に1.csv
、2.csv
、3.csv
が渡された場合、sed -e '1d' 1.csv
、sed -e '1d' 2.csv
、sed -e '1d' 3.csv
が各々実行されます。このオプションを指定しないと、標準入力がsed -e '1d' 1.csv 2.csv 3.csv
のようにまとめてコマンドに渡されます。後者は「1.csv
、2.csv
、3.csv
をマージした結果」の1行目を取り除いて出力することになり、1つ目以外のヘッダは残ったままになります。また、cat *.csv | sed -e '1d'
とした場合も同様に、結合後のファイルの1行目を取り除くことになり、期待する結果になりません。
sed
の代わりにtail
コマンドを使ってもできます。
find -name "*.csv" -exec tail -n +2 {} \;
または
find -name "*.csv" | xargs -n 1 tail -n +2
tail -n [- or +N] [filename]
で、 filename
の後ろを出力します。-N
を指定した場合は後ろからN行を出力します。+N
を指定した場合はN行目から末尾までを出力します。
結果ファイルにヘッダを付けたい場合は、どれか1つのファイルの1行目を付け足せばよいです。
cat *.csv | head -n 1 > result && find -name "*.csv" -exec sed -e '1d' {} \; >> result
または
cat *.csv | head -n 1 > result && find -name "*.csv" -exec tail -n +2 {} \; >> result
head -n [N]
は、標準入力の先頭N行を出力します。
&&
は、前のコマンドが正常終了ならば、後に続くコマンドを実行します。
以上です。誤り等ございましたらご指摘お願いします。