0

以下に示すように、タブ区切りの 2 つのファイルがあります。

ファイル 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
...

「chr1」、「123」の2つの列に基づいて2つのファイルを結合し、ファイルBからファイルAに最初の2つの列を追加します。これは次を使用して行われます

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 が大きすぎて、「6400 バイトのメモリを割り当てられません (メモリを割り当てられません)」というエラーが返されます。ファイルがより小さな部分で読み取られるように、誰かがこれを行う代替手段を提供できますか。

4

3 に答える 3

1

手っ取り早いテクニックは、入力データを操作して以下を使用することjoinです。

$ awk '{print $3"-"$4,$1,$2}' fileb | sort > fileb2
$ awk '{print $1"-"$2,$3,$4,$5}' filea | sort > filea2
$ join -a1 filea2 fileb2
chr1-123 aa b c xxxx abcd
chr1-234 a b c
chr1-345 aa b c yyyy defg
chr1-456 a b c

必要に応じて、最初の列の - を取り除くことができます。これは堅牢ではないことに注意してください。購入で十分な場合があります。 join必要なメモリが少なくて済みawk、入力を処理できる可能性があります...またはそうでない可能性があります!

于 2013-09-12T13:47:29.730 に答える