在数百万个csv文件上运行bash脚本

时间:2017-11-30 15:14:13

标签: bash sed cygwin

我正在尝试在超过100万bash个文件的csv脚本下运行:

#!/bin/bash
new_header="cell,id,too,issue,valid,DPT,RH,TMP,U,V"
sed -i'' "1s/.*/$new_header/" /cygdrive/d/csv/*.csv

但是在运行此代码时,我收到以下错误:

./bash.sh: line 3: 11464 Segmentation fault      (core dumped) sed -i'' "1s/.*/$new_header/" /cygdrive/d/csv/*.csv

我确信有一些方法可以在100万csv个文件上运行脚本,但我还没有找到任何内容。

2 个答案:

答案 0 :(得分:5)

我想通过展开/cygdrive/d/csv/*.csv生成的命令行的长度太长了。

解决此问题的一种方法是使用find

find /cygdrive/d/csv/ -name '*.csv' -exec sed -i '' "1s/.*/$new_header/" {} +

这将运行所需的最小数量的单独sed进程,使命令长度保持在限制范围内。

正如评论中所提到的,如果您的sed版本实际上需要在-i之后传递一个参数(GNU sed没有),那么在''之前需要一个空格。否则,您只需删除''

答案 1 :(得分:1)

在获得不应该实际发生的Segmentation Fault方面做得很好。

我会在这里使用find(或可能xargs)。它可以将结果分解为多次调用,并且永远不会对1,000,000 args做任何事情

find有一个-exec开关,允许它使用找到的文件执行命令,而不是简单地打印。