gnu parallel + sed 编辑 csv header 和内容
gnu parallel + sed to edit both csv header and contents
我正在尝试使用命令行工具来编辑一些 CSV,我有以下格式的几年文件夹:
- 数据集
- year_1(即 1929)
- csv_filename_1.csv
- csv_filename_2.csv
- csv_filename_3.csv
- ...
- year_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}”写入 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
目录中执行。
我正在尝试使用命令行工具来编辑一些 CSV,我有以下格式的几年文件夹:
- 数据集
- year_1(即 1929)
- csv_filename_1.csv
- csv_filename_2.csv
- csv_filename_3.csv
- ...
- year_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}”写入 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
目录中执行。