【问题标题】:Process multiple files at once using awk and parallel使用 awk 和并行处理多个文件
【发布时间】: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


【解决方案1】:

这对我有用

parallel "awk -F'|' '{print \$1\"|\"\"PO\"\$2}' {} > {}.tmp; mv {}.tmp {}" ::: input*.csv

【讨论】:

  • 您可以一步完成合并:parallel "awk -F'|' '{print \$1\"|\"\"PO\"\$2}' {}" ::: input*.csv > merged.csv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
相关资源
最近更新 更多