利用可能なすべての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
は、tail
aで接続して実行されることを&&
示します。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