我有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脚本感到非常自在,但解释为什么代码快速以及它正在做什么将是一个加分!谢谢!
答案 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范围时,您可以开始考虑预分配和跨设备并行写入。