入力ファイルが2つあります。
ファイル1(スペースで区切り)
ID POS a0 a1
SNP1 123 A C
SNP2 456 T C
SNP3 789 G A
ファイル2(スペースで区切り)
0 1 0 1 0 0 0 1
1 1 0 0 1 0 0 1
0 1 1 1 0 0 0 1
希望の出力
A C A C A A A C
C C T T C T T C
G A A A G G G A
ファイル2の各行は、ファイル1の1行を表します。秘密は、a0とa1の対応する文字をそれぞれ0と1に置き換えることです。これはほんのわずかな例であり、実際のファイルは600,000行を超えるほど巨大です。
私はawkまたはperlソリューションを探しています。
ベストアンサー1
読めないawkステートメント
$ awk 'NR>1{a[0]=$3;a[1]=$4;getline<f;for(i=1;i<=NF;i++)$i=a[$i];print}' f=file2 file1
A C A C A A A C
C C T T C T T C
G A A A G G G A
より読みやすい:
awk '
# skip the header in file1
NR == 1 {next}
{
# read the values from the file1 line
a[0] = $3
a[1] = $4
# replace the current record with the corresponding line from the map file
getline < map_file
# and now substitute the 0/1 with the values
for (i=1; i<=NF; i++)
$i = a[$i]
print
}
' map_file=file2 file1