
次のようなファイルがあります: (308545 行あります)
head output11.frq
CHR SNP A1 A2 MAF NCHROBS
1 1:775852:T:C T C 0.1707 3444
1 1:1120590:A:C C A 0.08753 3496
1 1:1145994:T:C C T 0.1765 3496
1 1:1148494:A:G A G 0.1059 3464
1 1:1201155:C:T T C 0.07923 3496
...
そして、最初の 24 行がコメント化され、コンマで区切られた別のファイル (marker-info) は次のようになります (合計 500593 行)。
1,742429,SNP_A-1909444,ss66079302,rs3094315,36.2,G,A,C,T,A,GCACAGCAAGAGAAAC[A/G]TTTGACAGAGAATACA,Sty,+,-,y,,,127,phs000018
1,769185,SNP_A-4303947,ss66273559,rs4040617,36.2,A,G,A,G,A,GCTGTGAGAGAGAACA[A/G]TGTCCCAATTTTGCCC,Sty,+,+,n,,,127,phs000018
1,775852,SNP_A-1886933,ss66317030,rs2980300,36.2,T,C,A,G,A,GAATGACTGTGTCTCT[C/T]TGAGTTAGTGAAGTCA,Nsp,-,+,y,,,127,phs000018
1,782343,SNP_A-2236359,ss66185183,rs2905036,36.2,C,T,C,T,A,CTCGATTTGTGTTCAA[C/T]ATATTTCATTTGTACC,Sty,-,-,n,,,127,phs000018
1,1201155,SNP_A-2205441,ss66174584,rs4245756,36.2,C,T,C,T,A,CCAGTGCTTTCAACCA[C/T]ACTCACTTTTCACTGT,Sty,+,+,n,,,127,phs000018
...
output11.frq の 2 番目の列を、1 番目と 2 番目の列に一致する値を持つ marker-info の 5 番目の列に置き換えたいので、この例では output11.frq の結果は次のようになります。
1 rs2980300 T C 0.1707 3444
1 rs4245756 T C 0.07923 3496
これを試してみましたが、空のファイルが得られました:
vi tst.awk
NR==FNR { map[$1,$2]=$5; next }
($1,$4) in map { $2=map[$1,$4]; print }
awk -f tst.awk FS=',' marker-info FS='\t' output11.frq > output11X.frq
編集:
これを実行してみました:
vi test2.awk
NR==FNR { map[$2]=$5 }
NR!=FNR { split($4, x, ":"); if(x[2] in map){ $4=map[x[2]]; print }}
awk -f test2.awk FS=',' marker-info FS='\t' output11.frq > output11X.frq
しかし、私はこれを手に入れました:
head output11X.frq
CHR SNP A1 A2 MAF NCHROBS rs41340551
1 1:775852:T:C T C 0.1707 3444 rs41340551
1 1:1120590:A:C C A 0.08753 3496 rs41340551
1 1:1145994:T:C C T 0.1765 3496 rs41340551
...
答え1
スクリプトの問題は、11:775852:T:C
という形式のキーを持つマップ内のキーとして、のような文字列を使用しようとしていたことです775852
。
コメントで最初の列は必要ないと思われると述べられていたため、この処理では最初の列を省略しました。
NR==FNR { map[$2]=$5 }
NR!=FNR { split($2, x, ":"); if(x[2] in map){ $2=map[x[2]]; print }}
split
以前は、文字列の関連部分を取得して条件を追加していました。その部分文字列が処理されるまで、必要な検索を実行する方法がなかったためです。
これは要求どおりに機能するようです:
[gnubeard@mothership: ~/dna]$ awk -f test.awk FS=',' marker-info FS=' ' output11.frq
1 rs2980300 T C 0.1707 3444
1 rs4245756 T C 0.07923 3496
持っているフィールドが、持っていると思われる列と一致していることを確認します。出力をタブ区切りにしたい場合は、OFS
次のようにスクリプトの後半で変数を設定できます。NR!=FNR { OFS="\t"; split($2, x, ":"); if(x[2] in map){ $2=map[x[2]]; print }}
FS
編集:コマンド内の変数を変更して、output11.frq の区切り文字を空白に変更しました。これにより、タブの数による煩わしさがなくなります。