Linux
用awk進行多列匹配和調整
我有一個看起來像這樣的文件
ID A1 A2 A3 1 A G A 2 T G A 3 T A G 4 T G A 5 A A G 6 A C A 7 C T G
它有數千行長,由 G、C、T、A 組成,其中 G 補充 C,A 補充 T。我要做的是在 A2 或 A3 中搜尋 A1 的匹配項。如果存在匹配,則保持原樣,如果不將 A2 和 A3 更改為它們的補碼,即 A=T 和 G=C,反之亦然。
所以輸出將是:
ID A1 A2 A3 1 A G A 2 T C T 3 T T C 4 T C T 5 A A G 6 A C A 7 C A C
我想我可以通過使用 awk 來過濾匹配和不匹配的 ID 來做到這一點:
awk '{if($2 != $3 || $2 != $4) print $0}' mergedlist > nonmatchlist
和
awk '{if($2 == $3 || $2 == $4) print $0}' mergedlist > matchlist
但它只適用於一個變數,即前者中的 T 和後者中的 A。
perl -lane 'sub flip { if ($_[0] eq "T") { "A" } elsif ($_[0] eq "A") { "T" } elsif ($_[0] eq "G") { "C" } elsif ($_[0] eq "C") { "G" } else { $_[0] } } if (!($F[1] eq $F[2] or $F[1] eq $F[3])) { $F[2] = flip($F[2]); $F[3] = flip($F[3]) } print "@F"' < input
應該很容易移植回來,
awk
因為它並沒有真正做任何花哨的事情,但這需要我更多時間來弄清楚。
您可以建構一個關聯數組作為補碼的查找表,例如
awk ' BEGIN { complement["A"]="T"; complement["T"]="A"; complement["C"]="G"; complement["G"]="C"; } NR>1 && $3!=$2 && $4!=$2 { $3 = complement[$3]; $4 = complement[$4]; } { print; } ' file