gpt4 book ai didi

bash - 如何在 awk/Bash 程序中根据前两列连接两个大文件?

转载 作者:行者123 更新时间:2023-12-02 19:14:39 25 4
gpt4 key购买 nike

有多个线程解释 herehere关于如何使用 awk 在两个文件之间执行合并例如。

我的问题有点复杂,因为我的文件非常大。 file1.tsv大小为 288GB,109 列,file2.tsv 16GB,4 列。我想根据前两列加入这些文件:

file1.tsv (制表符分隔)有 109 列(此处显示前 4 列和最后一列):

CHROM   POS     REF     ALT ... FILTER
chr1 10031 T C ... AC0;AS_VQSR
chr1 10037 T C ... AS_VQSR
chr1 10040 T A ... PASS
chr1 10043 T C ... AS_VQSR
chr1 10055 T C ... AS_VQSR
chr1 10057 A C ... AC0

file2.tsv (制表符分隔)有 4 列:

CHROM   POS     CHROM_hg19  POS_hg19
chr1 10031 chr1 10034
chr1 10037 chr1 10042
chr1 10043 chr1 10084
chr1 10055 chr1 10253
chr1 10057 chr1 10434

我希望添加 file2.tsv 中的最后两列至file1.tsv通过匹配 CHROMPOS同时保留 file1.txt 中的所有不匹配行:

file3.txt

CHROM   POS     REF     ALT ... FILTER        CHROM_hg19    POS_hg19
chr1 10031 T C ... AC0;AS_VQSR chr1 10034
chr1 10037 T C ... AS_VQSR chr1 10042
chr1 10040 T A ... PASS - -
chr1 10043 T C ... AS_VQSR chr1 10084
chr1 10055 T C ... AS_VQSR chr1 10253
chr1 10057 A C ... AC0 chr1 10434

但正如您所想到的,这些文件很大。我尝试了以下方法:

awk 'NR==FNR{a[$1,$2]=$3;next} ($1,$2) in a{print $0, a[$1,$2]}' file1.txt file2.txt

当我按下回车键时,我发现我的内存力猛增,但没有产生任何结果。我不确定这最终是否会产生正确的结果或它将使用多少内存。有没有更好的方法使用awk以任何方法加入我的文件或任何Bash程序?

提前谢谢您。

最佳答案

使用 joinsedbash(进程替换):

join -t $'\t' -a 1 <(sed 's/\t/:/' file1.tsv) <(sed 's/\t/:/' file2.tsv) | sed 's/:/\t/' > file3.txt

此解决方案假设前两列在两个文件中按升序排列在一起。


参见:man join

关于bash - 如何在 awk/Bash 程序中根据前两列连接两个大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63834611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com