【发布时间】:2021-09-18 08:25:36
【问题描述】:
我有一百多个部分 .csv 文件,其中包含由“|”分隔的数据。我需要使用 awk 和并行在每个零件文件的第二列添加前缀。
我一次只做一个文件,但需要几个小时。所以想并行。
input1.csv
10|20
10|30
10|40
input2.csv
20|30
20|40
line1|10
预期输出
input1.csv
10|P20
10|P30
10|P40
input2.csv
20|P30
20|P40
line1|P10
我正在使用它,并且在我一次处理一个文件时工作,但我需要更快的东西来并行处理多个文件
awk 'BEGIN{FS=OFS="|"} {$2 = "P" $2} 1' input1.csv > in.tmp && mv in.tmp input1.csv
awk 'BEGIN{FS=OFS="|"} {$2 = "P" $2} 1' input2.csv > in.tmp && mv in.tmp input2.csv
end 最后将所有输入*.csv 文件合并到输入中
【问题讨论】:
-
finally merge all the input*.csv files into input如何合并它们>? -
@KamilCuk 类似这个 cat 1.txt 2.txt 3.txt > 0.txt,但我有一千个文件,更简单的就好了
-
output expected那么您关心每个被修改的文件,还是只关心结尾的0.txt文件?您确定您的进程不受 I/O 限制吗?如果你有一张磁盘,那么运行并行计算毫无意义 - 无论如何,你的 I/O 将受到一张磁盘的限制。 -
在新的目录树中重新创建输出文件,否则您将在中途结束该过程,部分文件已修改,有些未修改,然后您必须添加逻辑避免让事情变得更糟。
-
从表面上看,我认为
sed 's/|/|P/' input*.csv > input可以解决问题,除非您对命令行的长度有限制(因此input*.csv列表太大)。如果你确实有这样的问题,那么考虑find . -name 'input*.csv' -exec sed 's/|/|P/' {} + > input。我将“将所有input*.csv文件合并到input”解释为要求输出是一个名为input的文件。这不会修改input*.csv文件;如果这是操作的关键部分,您需要一个不同的答案。
标签: shell csv awk gnu-parallel