gnu parallel + sed 编辑 csv 标题和内容

Posted

技术标签:

【中文标题】gnu parallel + sed 编辑 csv 标题和内容【英文标题】:gnu parallel + sed to edit both csv header and contents 【发布时间】:2021-12-15 20:57:08 【问题描述】:

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

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

我正在尝试将文件名附加到其内容中,创建一个名为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”按原样写入文件,要么将 sed 错误 "sed: -e expression #1, char 6: unknown command: '\'" 抱怨逗号或斜杠。我也尝试将-e '1s/$/,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==1a="filename" FNR>1a=d print $0","a' csv_filename_1.csv | less

【问题讨论】:

“类似的东西?”两个 cmets:1) "expression 1" char 6 将指示第一个 -e 命令。 2) 然而,表达式 2 似乎会产生关于 char 6 的抱怨。即 sed -n '2,\$ p' 获取:sed: -e expression #1, char 6: unterminated address regex`。 (因为没有理由转义 $ 那里) Net:如果你想解释 sed,你需要准确地显示导致错误的原因。 是的,可能存在一些复制粘贴问题,因为我是通过一些中间尝试得到的。我当时真的很沮丧。 【参考方案1】:

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

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

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

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

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

【讨论】:

哇!我知道“!”操作员,但没想到那样使用它。而关于替代分隔符,那就是哇。我在哪里可以了解更多信息? @paulochf 在***的搜索框中输入[sed]并选择learn more

以上是关于gnu parallel + sed 编辑 csv 标题和内容的主要内容,如果未能解决你的问题,请参考以下文章

“sed”中的range-operator实际上做了什么,是否在GNU / busybox中被破坏了?

GNU Parallel面向静默退出和无效选项错误

sh GNU Parallel + cUrl

GNU Parallel 面临静默退出和无效选项错误

GNU Parallel 与多个文件的 shellcheck

有没有办法调试 GNU Parallel?