awkを使用して2つの配列の値を比較して印刷します。

awkを使用して2つの配列の値を比較して印刷します。
A01     11814111        11814112        GA      AA
A01     11485477        11485519        AG      AT
A01     11667935        11667971        TC      TA
A01     11876070        11876079        TC      TG
A01     11613258        11613277        AC      GC
A01     11876079        11876107        CA      GA
A01     11616453        11616463        TA      TG
A01     11875367        11875368        GG      GA
A01     11667971        11667993        CA      AA
A01     11564406        11564411        TA      TG
A01     11477215        11477235        TG      CG

awkスクリプトは、4列と5列の値を分割してペアでテストするために使用されます。 2つの配列の値が異なる場合、最初の列の文字列と2番目または3番目の列の対応する値が下線で印刷されます。 2つのヌクレオチドが異なる場合、2行の出力が生成されます。また、各IDに対して4列と5列の異なる値を印刷します。

awk '{ split($4, a1, ""); split($5, a2, ""); for (i in a1) { if (a1[i] != a2[i]) print $1 "_" $(i+1) }}' input > out

最初の部分を実行します。

必須出力は次のとおりです。

A01_11814111 G A

A01_11485519 G T

ベストアンサー1

コンテンツtmp.txt

A01     11814111        11814112        GA      AA
A01     11485477        11485519        AG      AT
A01     11667935        11667971        TC      TA
A01     11876070        11876079        TC      TG
A01     11613258        11613277        AC      GC
A01     11876079        11876107        CA      GA
A01     11616453        11616463        TA      TG
A01     11875367        11875368        GG      GA
A01     11667971        11667993        CA      AA
A01     11564406        11564411        TA      TG
A01     11477215        11477235        TG      CG

コンテンツtmp.awk

{
 if (substr($4,1,1) != substr($5,1,1)) {
    print $1 "_" $2 " " substr($4,1,1) " " substr($5,1,1);
 }
 if (substr($4,2,1) != substr($5,2,1)) {
    print $1 "_" $3 " " substr($4,2,1) " " substr($5,2,1);
 }
}

サンプル出力

[user@server ~]$ awk -f tmp.awk tmp.txt
A01_11814111 G A
A01_11485519 G T
A01_11667971 C A
A01_11876079 C G
A01_11613258 A G
A01_11876079 C G
A01_11616463 A G
A01_11875368 G A
A01_11667971 C A
A01_11564411 A G
A01_11477215 T C

ボーナス。存在するbash

#!/bin/bash
while read line
do
   set $line
   if [ ${4:0:1} != ${5:0:1} ]
   then printf "$1_$2 ${4:0:1} ${5:0:1}\n"
   fi
   if [ ${4:1:1} != ${5:1:1} ]
   then printf "$1_$3 ${4:1:1} ${5:1:1}\n"
   fi
done < tmp.txt

サンプル出力

A01_11814111 G A
A01_11485519 G T
A01_11667971 C A
A01_11876079 C G
A01_11613258 A G
A01_11876079 C G
A01_11616463 A G
A01_11875368 G A
A01_11667971 C A
A01_11564411 A G
A01_11477215 T C

おすすめ記事