在数百万个csv文件上运行bash脚本
我正在尝试在100多万个在数百万个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_
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和它之后的所有东西