连接没有顶行的大文件 - python或bash?

时间:2014-07-08 17:50:07

标签: python linux bash concatenation large-files

我有10个.txt的基因型数据文件 - 每个来自不同的染色体。它们在每一行上都具有相同的列数,并且列已经全部按相同的顺序排列。每个文件都以相同的第一行开头。

我想要做的是按照chr1,chr2,chr3 ... chr10的顺序将所有10个文件附加到单个基因型文件中。但是,我想保持标题行只能从chr1开始,所以它仍然是一个标题,并在将它们全部连接起来之前从后续染色体中删除所有标题。

例如,如果我有:

文件1:

chr, position, geno1, geno2
1, 100, A, C
1, 200, G, T

file2的:

chr, position, geno1, geno2
2, 50, T, A
2, 150, C, G

我想以file_combined结束:

chr, position, geno1, geno2
1, 100, A, C
1, 200, G, T
2, 50, T, A
2, 150, C, G

最好/最快的方法是什么,考虑到每个文件是400-600Mb,结果文件是~6Gb?我对编写Python和Linux shell脚本感到非常自在,但解释为什么代码快速以及它正在做什么将是一个加分!谢谢!

2 个答案:

答案 0 :(得分:4)

你可以做到

cp chr1 output
for f in chr[2-9] chr10; do sed -n '2,$p' $f >> output; done
评论后

更新
事实上,尾巴更简单

cp chr1 output
tail -qn +2 chr[2-9] chr10 >> output

答案 1 :(得分:2)

最快的方法是不这样做。

例如,如果您打算将此最终文件提供给程序,则可以使用:

{
  head -n 1 file1
  for f in file{1..10}
  do
    tail -n +2 "$f"
  done
} | yourprogram

这将生成与您描述的完全相同的流并将其提供给您的程序,但不会浪费时间将其写入文件。

如果您确实需要文件,而不是| yourprogram,则可以使用> file。这对于您的少量数据来说已经足够了。

当您的数据达到TB范围时,您可以开始考虑预分配和跨设备并行写入。