私のLinuxディレクトリにはファイルダンプが含まれています。
EDW_Infile_ABC_Daily_Activity_20190204.csv
EDW_Infile_ABC_Daily_Activity.zip
EDW_Infile_PQRInc_Daily_Activity_20190204.csv
EDW_Infile_PQRInc_Daily_Activity_zip
EDW_Infile_ABC_Daily_Payment_20190204.csv
EDW_Infile_PQRInc_Daily_Payment_20190204.csv
EDW_Infile_ABC_Daily_Status_20190204.csv
EDW_Infile_PQRInc_Daily_Status_20190204.csv
これらのファイルは、次のような一般的な名前パターンに従います。
EDW_Infile_*<3 to 8 bytes company name>*_Daily_Activity_*YYYYMMDD*.csv
EDW_Infile_*<3 to 8 bytes company name>*_Daily_Payment_*YYYYMMDD*.csv
EDW_Infile_*<3 to 8 bytes company name>*_Daily_Status_*YYYYMMDD*.csv
私はどのように -
1)EDW_Infile_パターンに従って、すべての顧客、すべての日付のすべてのファイルを見つけます。{3~8バイトの名前}_日常生活_{すべての日付}.csv
2)各ファイルにはヘッダーが含まれています。すべて1つのファイルにマージし、ヘッダーが1つだけある方法
答え1
ファイル名を制御できず、同様のファイル名があり、ワイルドカードをEDQ_Infile_some uninteresting stuff here_Daily_Activity_junk here.csv
使用したくない場合に備えて、より具体的に答えるために私のzshの知識を少し扱っています。*
ファイル名のリストを収集するには...
EDW_Infile_{3~8バイトのすべての名前}_Daily_Activity_{すべての日付}.csvパターンに従います。
zshでこのExtended_globモードを設定します(入力しないでください$
。これはシェルプロンプトです)。
$ set -o extended_glob
$ files=(EDW_Infile_?(#c3,8)_Daily_Activity_[[:digit:]](#c8).csv)
プレーンテキストに加えて、モードは次のとおりです。
?
- 任意の(単一)文字(#c3,8)
- 3〜8文字(含む)が必要です。[[:digit:]]
- 数字が必要です(#c8)
--8個必要
リストを確認してください:
$ print -l $files
EDW_Infile_ABC_Daily_Activity_20190204.csv
EDW_Infile_PQRInc_Daily_Activity_20190204.csv
それまで…
すべて1つのファイルにマージし、ヘッダーは1つだけです。
{ head -1 "${files[1]}"; for f in $files; do sed 1d "$f"; done; } > output.csv
これは2つのコマンドをグループ化し、その出力をにリダイレクトしますoutput.csv
。最初のコマンドは、配列head
の最初のファイルから最初の行を取得し、すべてのファイルを繰り返して最初の行を削除します(デフォルトは残りを標準出力として印刷)。 。
答え2
あなたはこのようなことをしたいかもしれません
# collect all the "EDW_Infile_ABC" prefixes
declare -A prefix
for f in EDQ_Infile_*_Daily_Activity_*.csv; do
p=${f%_*.csv}
prefix[$p]=1
done
for p in "${!prefixes[@]}"; do
awk 'NR==1 {print} FNR==1{next} {print}' "$p"_*.csv > "$p"_all.csv
zip "$p".zip "$p"_all.csv
rm "$p"_all.csv
done
Bashの場合、連想配列にはバージョン4が必要です。それ以外の場合は、位置パラメータを使用できます。