【发布时间】:2021-12-15 20:57:08
【问题描述】:
我正在尝试使用命令行工具来编辑一些我在几年文件夹中具有以下格式的 CSV:
- 数据集
- year_1(即 1929 年)
- csv_filename_1.csv
- csv_filename_2.csv
- csv_filename_3.csv
- ...
- 年_2
- ...
- year_1(即 1929 年)
我正在尝试将文件名附加到其内容中,创建一个名为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 '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
【问题讨论】:
-
“类似的东西?”两个 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,你需要准确地显示导致错误的原因。 -
是的,可能存在一些复制粘贴问题,因为我是通过一些中间尝试得到的。我当时真的很沮丧。
标签: bash csv sed gnu-parallel gnu-findutils