gnu parallel + sed 编辑 csv header 和内容

gnu parallel + sed to edit both csv header and contents

我正在尝试使用命令行工具来编辑一些 CSV,我有以下格式的几年文件夹:

我正在尝试将文件名附加到其内容,创建一个名为 filename 的新列,其中的所有列都包含 ./year_1/csv_filename_1.csv。之后,我会压缩它。

由于年份文件夹的数量(将近 100 个)和每个文件夹中的 CSV 数量(总共 100k+),我打算使用与 运行 并行的 gnu,并且

我正在尝试使用 sed 做类似

的事情
fname="1929/csv_filename_1.csv" &&          \ # to simulate parallel's parameterization
    sed -E -e '1s/$/,filename/'             \ # append ",filename" to CSV header
           -e '2,$s/$/,${fname}/' ${fname} \ # append the filename string to the content

但是我无法让 sed 使用第二个表达式,因为我要么将“${fname}”写入 as-is 到文件,要么 sed 错误 "sed: -e expression #1, char 6: unknown command: '\'" 抱怨逗号或斜杠。我也曾尝试将 -e '1{s/$/,filename/};2,${s/$/,${fname}/}' 之类的表达式分组,但无济于事。

目前,我放弃了sed并开始尝试使用awk,但不知道为什么它不起作用很困扰我,所以我来问为什么以及如何让它起作用。

关于我打算如何 运行 这件事的更多信息。就像

find ~/dataset -iname "*csv" -print0 | parallel -0 -j0 '<the whole command here (sed + gz)>'

我该怎么做?我忘记了什么?谢谢大家!

PS: 刚用awk搞定

awk -v d="csv_filename_1.csv" -F"," 'FNR==1{a="filename"} FNR>1{a=d} {print [=13=]","a}' csv_filename_1.csv | less

这可能对您有用(GNU 并行和 sed):

find . -type f -name '*.csv' | parallel sed -i \''1s/$/,filename/;1!s#$#,{}#'\' {}

使用 find 将文件名传递给并行命令。

使用 sed 将 ,filename 附加到每个文件的标题,并将 {} 中的文件名附加到文件中的每一行。

N.B。在第二个 sed 命令中使用替代分隔符 s#...#...# 以允许文件名斜杠。此外,查找应在 dataset 目录中执行。