我的许多子文件夹中有一堆 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
这仅打印第一个文件的标题行。