Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数百万个csv文件上运行bash脚本_Bash_Sed_Cygwin - Fatal编程技术网

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

在数百万个csv文件上运行bash脚本,bash,sed,cygwin,Bash,Sed,Cygwin,我正在尝试在100多万个csv文件上运行下面的bash脚本: #!/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_

我正在尝试在100多万个
csv
文件上运行下面的
bash
脚本:

#!/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
文件上运行脚本,但我还没有找到任何东西。

很好地解决了
分段错误
,这实际上不应该发生

我会在这里使用
find
(或者可能使用
xargs
)。它可以将结果分解为许多调用,并且永远不会对1000000 args执行任何操作


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

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

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

find /cygdrive/d/csv/ -name '*.csv' -exec sed -i '' "1s/.*/$new_header/" {} +
这将运行所需的最小数量的单独sed进程,并将命令长度保持在限制范围内


如注释中所述,如果您的sed版本实际上需要在
-i
之后传递一个参数(GNU sed不需要),那么您需要在
'
之前留一个空格。否则您只需删除
'

谢谢!但是我第一次使用bash脚本。。我不知道这个
find
是如何工作的。你能用密码告诉我吗?我真的很感谢你的努力。我想汤姆·费内克在他的回答中可能已经这样做了。仅供参考,在命令行上,您应该能够调用
man-find
以获取手册。此外,谷歌“LinuxManFind”应该在网络上提供相同的手册。
sed-i'
sed-i
相同。如果我们真的想把一个空参数传递给
-i
,我们应该把它作为
sed-i'
@TomFenech调用,当我在200个文件上运行这段代码时,它工作正常,但当我在包含100万
csv
文件的目录下运行这段代码时。它不起作用了。有什么评论吗?@TomFenech,现在它没有抛出这个错误
/bash.sh:line 3:11464分段错误(内核转储)
。它正在运行,但没有重命名第一行。@TomFenech,它只是在运行,没有抛出上述错误。但是当我检查了十个随机的
csv
文件,只是为了确认它是否重命名了第一行。它不是重命名它。我的意思是删除-exec和它之后的所有东西