我正在尝试使用命令行工具来编辑一些我在几年文件夹中具有以下格式的 CSV:
- 数据集
- year_1(即 1929 年)
- csv_filename_1.csv
- csv_filename_2.csv
- csv_filename_3.csv
- ...
- year_2
- ...
- year_1(即 1929 年)
我正在尝试将文件名附加到其内容中,为其中的所有列创建一个名为filename
with的新列./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