Bash
將子文件夾中的多個 CSV 文件合併到一個唯一的文件中,並在新列中添加文件名
我在許多子文件夾中有一堆 CSV 文件(父目錄中只有 1 級子文件夾,沒有進一步嵌套)。
每個 CSV 文件有三列;i, k, v 混合了字元串和數字值。
分隔符是
;
.有時, ‘;’ 是字元串的一部分。如果是這樣,它會用反斜杠轉義
\;
。單個文件的內容範例
subfoler1/file001.csv
;index,key,value 0,Contact,mailto:sys@admin.org\; 1,IDG,"44.1\,80.1" 2,Information,https://www.sys.admin.org/\;
我想將它們合併到一個唯一的 CSV 文件中,同時將文件名附加到一個新列,比如說“文件名”;
index,key,value,filename 0,Contact,mailto:sys@admin.org\;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:dev@admin.org\;subfolder2/file002.csv 1,IDG,"5.2\,7.4";subfolder2/file002.csv
如果這使事情變得更容易,可以跳過最後一列中的文件夾名稱,只取文件名。
我過去做過一次;
awk '{print $0";"FILENAME}' .*.csv > merged.csv
但是文件必須是一個文件夾,不能分散在多個子文件夾中。
如何修改此命令以獲得我想要的結果?
未經測試:
awk -v OFS=';' ' NR == 1 { print $0, "filename" } FNR > 1 { print $0, FILENAME } ' */*.csv
這僅從第一個文件列印標題行。