サブフォルダにある複数のCSVファイルを1つの一意のファイルにマージし、新しい列にファイル名を追加します。

サブフォルダにある複数のCSVファイルを1つの一意のファイルにマージし、新しい列にファイル名を追加します。

多くのサブフォルダには複数のCSVファイルがあります(親ディレクトリにはサブフォルダが1つしかなく、ネストされなくなりました)。

各CSVファイルには3つの列があります。 i、k、vには文字列と数値が混在しています。
区切り記号はです;
時々';'は文字列の一部です。その場合は、バックスラッシュを使用してエスケープしてください\;

単一ファイルのサンプルコンテンツsubfoler1/file001.csv

index,key,value
0,Contact,mailto:[email protected]\;
1,IDG,"44.1\,80.1"
2,Information,https://www.sys.admin.org/\;

ファイル名を新しい列に追加しながら、独自のCSVファイルにマージしたいと思います。 「ファイル名」と仮定します。

index,key,value,filename
0,Contact,mailto:[email protected]\;subfolder1/file001.csv
1,IDG,"44.1\,80.1"subfolder1/file001.csv
2,Information,https://www.sys.admin.org/\;subfolder1/file001.csv
0,Contacts,mailto:[email protected]\;subfolder2/file002.csv
1,IDG,"5.2\,7.4";subfolder2/file002.csv

作業が簡単になったら、最後の列のフォルダ名をスキップしてファイル名を取得するだけです。

私は過去にこのようなことをしたことがありました。

awk '{print $0";"FILENAME}' .*.csv > merged.csv

ただし、ファイルは単一のフォルダに配置する必要があり、複数のサブフォルダに分散することはできません。

必要な結果を得るには、このコマンドをどのように変更する必要がありますか?

答え1

テストされていません:

awk -v OFS=';' '
    NR == 1 { print $0, "filename" }
    FNR > 1 { print $0, FILENAME }
' */*.csv

これは、最初のファイルのヘッダー行だけを印刷します。

関連情報