2

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

  • 数据集
    • year_1(即 1929 年)
      • csv_filename_1.csv
      • csv_filename_2.csv
      • csv_filename_3.csv
      • ...
    • year_2
      • ...

我正在尝试将文件名附加到其内容中,为其中的所有列创建一个名为filenamewith的新列./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}”按原样写入文件,要么 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 $0","a}' csv_filename_1.csv | less
4

1 回答 1

3

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

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

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

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

注意 在第二个 sed 命令中使用替代分隔符s#...#...#以允许文件名斜杠。也应该在dataset目录中执行查找。

于 2021-11-01T17:25:41.310 回答