将子文件夹中的多个 CSV 文件合并到一个唯一文件中,并在新列中添加文件名

将子文件夹中的多个 CSV 文件合并到一个唯一文件中,并在新列中添加文件名

我的许多子文件夹中有一堆 CSV 文件(父目录中只有 1 层子文件夹,没有进一步嵌套)。

每个 CSV 文件有三列; 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

这仅打印第一个文件的标题行。

相关内容