【发布时间】:2013-09-16 21:58:58
【问题描述】:
我有两个如下所示的以制表符分隔的文件:
文件 A
chr1 123 aa b c d
chr1 234 a b c d
chr1 345 aa b c d
chr1 456 a b c d
....
文件B
xxxx abcd chr1 123 aa c d e
yyyy defg chr1 345 aa e f g
...
我想将基于 2 列的两个文件与“chr1”、“123”连接起来,并将文件 B 中的前两列添加到文件 A。这是使用
awk 'NR==FNR{a[$3,$4]=$1OFS$2;next}{$7=a[$1,$2];print}' OFS='\t' fileb filea
输出:
chr1 123 aa b c d xxxx abcd
chr1 234 a b c d
chr1 345 aa b c d yyyy defg
chr1 456 a b c d
但是对于真实的数据,fileb 太大并且返回错误:“can't allocate 6400 bytes of memory (cannot allocate memory)”。有人可以提供另一种方法来执行此操作,以便以较小的部分读取文件。
【问题讨论】:
-
如果顺序不重要a并且
fileA小于fileB,尝试相反。将fileA保存在内存中,每行处理fileB。 -
如果行已排序,您可以限制存储的键和值的数量。
-
@Birei 我希望将信息添加到文件 A 中,这样它就不能被反转。
-
@konsolebox 你能编辑一下代码吗