在Unix中向目录中的多个文件添加头的最佳方法?

时间:2019-03-19 14:32:32

标签: unix sed

在其他任何人进行检查之前,我确信这不是现有问题的重复,即如何在Unix中向多个文件添加标头(问题在这里:Adding header into multiple text files) 。这更多地是关于我当前用于解决当前问题的解决方案的优化。

我有许多目录,其中有超过20000个文件,并且要为每个文件添加相同的标头。

我一直在做的是:

sed -i '1ichr\tpos\tref\talt\treffrq\tinfo\trs\tpval\teffalt\tgene' *.txt

现在,它确实可以按照我想要的方式工作,但是存在一些问题。

首先,这似乎是一种非常慢的方法,并且要花很长时间才能浏览全部20K +文件。

第二,更令人沮丧的是,有时我与正在使用的服务器的连接在此漫长的过程中超时,这意味着该命令将无法完成运行,因此我最终得到一半的文件带有标头,而另一半则没有标头。而且,如果我再次从头开始,这意味着许多文件将具有两次标头,因此我实际上必须经过重新创建它们的过程,以便可以一次添加所有标头。

所以,我想知道的是,是否有更好/更快的解决方案来解决这个问题。我上面链接的问题似乎实际上要慢一些(考虑到每个文件在通过循环时似乎需要在命令行上执行更多操作),因此似乎无法解决该问题。

2 个答案:

答案 0 :(得分:1)

First, adding a header is slow. You have to move the entire file contents to add something at the start. Adding a trailer would be very fast.

Second, use nohup:

nohup - run a command immune to hangups, with output to a non-tty

Using nohup sed -i '1ichr\tpos\tref\talt\treffrq\tinfo\trs\tpval\teffalt\tgene' *.txt will keep the command running on the background even if the server times you out.

答案 1 :(得分:1)

请勿使用-i。当您被打扰时,它会使事情感到困惑。而是使用

mkdir -p ../output-dir
for file in *.txt; do 
  sed '1ichr\tpos\tref\talt\treffrq\tinfo\trs\tpval\teffalt\tgene' "$file" > ../output-dir/"$file"
done

完成后,可以根据需要重命名目录。这不能解决连接问题(ThoriumBR的nohup的建议对此很有用),但是当发生这种情况时,您可以更轻松地恢复状态。