複雑な名前パターンに一致するファイルを見つけて結合するコマンド

複雑な名前パターンに一致するファイルを見つけて結合するコマンド

私の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が必要です。それ以外の場合は、位置パラメータを使用できます。

関連情報