Bash

將子文件夾中的多個 CSV 文件合併到一個唯一的文件中,並在新列中添加文件名

  • February 5, 2021

我在許多子文件夾中有一堆 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

這僅從第一個文件列印標題行。

引用自:https://unix.stackexchange.com/questions/632719