在其他任何人进行检查之前,我确信这不是现有问题的重复,即如何在Unix中向多个文件添加标头(问题在这里:Adding header into multiple text files) 。这更多地是关于我当前用于解决当前问题的解决方案的优化。
我有许多目录,其中有超过20000个文件,并且要为每个文件添加相同的标头。
我一直在做的是:
sed -i '1ichr\tpos\tref\talt\treffrq\tinfo\trs\tpval\teffalt\tgene' *.txt
现在,它确实可以按照我想要的方式工作,但是存在一些问题。
首先,这似乎是一种非常慢的方法,并且要花很长时间才能浏览全部20K +文件。
第二,更令人沮丧的是,有时我与正在使用的服务器的连接在此漫长的过程中超时,这意味着该命令将无法完成运行,因此我最终得到一半的文件带有标头,而另一半则没有标头。而且,如果我再次从头开始,这意味着许多文件将具有两次标头,因此我实际上必须经过重新创建它们的过程,以便可以一次添加所有标头。
所以,我想知道的是,是否有更好/更快的解决方案来解决这个问题。我上面链接的问题似乎实际上要慢一些(考虑到每个文件在通过循环时似乎需要在命令行上执行更多操作),因此似乎无法解决该问题。
答案 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
的建议对此很有用),但是当发生这种情况时,您可以更轻松地恢复状态。