多くのサブフォルダには複数の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
これは、最初のファイルのヘッダー行だけを印刷します。