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
答え2
奇妙な解決策:
awk '{
split($4$5, arr, "");
if(arr[1] == arr[3])
print $1 "_" $3, arr[2], arr[4];
else
print $1 "_" $2, arr[1], arr[3];
}' input.txt
sedソリューション:
sed -r '
{
s@(\w*) *(\w*) *(\w*) *(\w)(\w) *\4(\w)$@\1_\3 \5 \6@
s@(\w*) *(\w*) *(\w*) *(\w)(\w) *(\w)\5$@\1_\2 \4 \6@
}' input.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