Linux

用awk進行多列匹配和調整

  • April 14, 2019

我有一個看起來像這樣的文件

   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

引用自:https://unix.stackexchange.com/questions/223295