java - 合并/加入两个大文件

标签 java c join awk merge

我有 2 个文件想加入第一列: 文件 1 包含 46395029 行,文件 2 包含 86510559。

文件1.txt

>ID sequence
CJP75M1:393:C2T21ACXX:8:1101:2069:1997 1:N:0:_45    TAGTATTACGACG
CJP75M1:393:C2T21ACXX:8:1101:2711:1992 1:N:0:_65    TCCGAGGCCCTGTAATTGGAATGAGTAC
CJP75M1:393:C2T21ACXX:8:1101:3822:1989 1:N:0:_115   CCGGAGAGGGAGCCTGAGAAACGGCTACCAC

文件2.txt

>ID      Barcode
CJP75M1:393:C2T21ACXX:8:1101:2069:1997 1:N:0:_45    CTCG
CJP75M1:393:C2T21ACXX:8:1101:2711:1992 1:N:0:_65        CTAG
CJP75M1:393:C2T21ACXX:8:1101:3822:1989 1:N:0:_115       CTGG

我想在第一个列上合并这两个文件:

>TAGTATTACGACG    CTCG
TCCGAGGCCCTGTAATTGGAATGAGTAC     CTAG
CCGGAGAGGGAGCCTGAGAAACGGCTACCAC     CTGG

只需要 file1 中的行,因此结果文件应“仅”包含 46395029 行。 我用 awk 做到了:

    awk 'BEGIN {FS= "\t"; OFS="\t"} { while (getline < "file1.txt") { f[$1] = $2} {print $2, f[$1] }}' "file2.txt" | sed '1d' > result.txt

但它真的很长(运行 2 天)。我有一个 64 位/16Go RAM 的 linux debian(稳定)服务器

有什么想法吗? 谢谢

最佳答案

这是 awk 的另一种方式:

awk 'FNR==1{next}NR==FNR{map[$1,$2]=$3;next}(map[$1,$2]){print map[$1,$2],$3}' file2 file1
  • 跳过两个文件的第一行
  • 从 file2 创建一个索引在第 1 列和第 2 列的数组
  • 如果 map 存在于 file1 中,打印该行

关于java - 合并/加入两个大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22711489/

相关文章:

java - 更新 Android 选项卡图标

java - 无法从 JAR 文件获取带注释的值

java - Java 中有类似 find_if 的东西吗?

mysql - 通过连接一列从不同的表返回两列

php - Yii2 query all get value in join

sql-server-2008 - 内部与另一个表连接时如何保留临时表行的顺序?

java - 需要策略模式帮助

c - Getopt- 为参数传递字符串参数

将结构成员写入内存的通用接口(interface)模式?

c - 在 C 中使用快速排序反向排序(降序)?