N個のcsvファイルを1つのcsvファイルにリンクする

N個のcsvファイルを1つのcsvファイルにリンクする

利用可能なすべてのCSVファイルを1つに関連付けるシェルスクリプトを作成する必要があります。これらのCSVファイルはすべて同じ構造(たとえば、同じヘッダーと列数)を持ち、ファイルには共通の接頭辞がありますGFP

たとえば、ある日、次のようなファイルが発生する可能性があります。

GFP_20210609.csv
GFP_20210610.csv

あるいは、時々これらのファイルがたくさんあるかもしれません。ここでの問題は、1日にどれだけのファイルが表示されるかわからないということです(1日に5つ以下のCSVファイルを想定)。

私はシェルスクリプトに初めて触れました。どんな助けでも大変感謝します。

sed 1d GFP_20210610.csv > GFP_20210610_NO_HEADER.csv
cat GFP_20210609.csv GFP_20210610_NO_HEADER.csv > GFP_FINAL.csv

答え1

努力するawk

awk 'NR==1||FNR>1' GFP*.csv > output.csv

これにより、重複ヘッダーを抑制するために、2番目の行(FNR>1各ファイルの行カウンタが1より大きいという意味)から始まる各ファイルのすべての行が印刷されますが、最初の行である最初の行(NR==1)を印刷する必要があります。ファイル。

これにより、出力がファイルにリダイレクトされますoutput.csv

awkこの構文は、ルールブロックの外側で見つかった条件(){ ...}がtrueの場合、現在の行が印刷されるという事実を利用します。この場合、実際に編集したくなく入力ファイルのみをフィルタリングするため、ルールブロックを完全に省略できます。

答え2

まず、ヘッダファイルを一度作成し、残りのcsvファイルと同じフォルダに保存します。

head -qn 1 GFP_20210609.csv > common.header

共通_ヘッダー.csv選択したcsvファイルの最初の行が含まれています(つまり、すべてのcsvファイルのヘッダーは同じです)。このファイルを一度ビルドし、後で使用するために同じディレクトリに保存する必要があります。

headコマンドが最初に出力されます。Nヘッダファイルの場合は「1」のテキストファイルの行です。

tailコマンド出力が最後です。Nテキストファイルの行。ヘッダーの重複を避けるために、「1」からすべてのcsvファイルの最初の行を無視します。

追加 - キュー(quiet)パラメーターを使用headして、tail最終ファイルに不要な追加の出力情報を防止します。

次の行はスクリプトのソースコードです。

cat common.header > FINAL.csv && tail -qn 1 GFP_*.csv >> FINAL.csv

2つのコマンドcatは、tailaで接続して実行されることを&&示します。tailただcatコマンドが成功したら。

(*)注:次のようにtail -qn 1...書くこともできますtail -q -n 1...。と同じ意味です。

答え3

すべてのeof条件で明示的にperlファイルハンドルを閉じると、ラインカウンタがリセットされます。絶対最初の行の場合、スカラー変数 $nr を取得して事前にインクリメントします。

perl -lne 'print if
  ++$nr==1||$.>1;
  eof && close(ARGV);
' GFP_*.CSV > total.csv

GNU sed-sファイルを個別に処理する分割ストリームオプションと共に使用されます。

{
head -n 1 "$(printf '%s\n' GFP_*.CSV |head -n 1 -)"
sed -se 1d GFP_*.csv
} > total.csv

関連情報