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열의 값을 분할한 후 쌍으로 테스트하는 데 사용됩니다. 두 배열의 값이 다른 경우 첫 번째 열의 문자열과 두 번째 또는 세 번째 열의 해당 값이 밑줄로 인쇄됩니다. 두 뉴클레오티드가 서로 다른 경우 두 줄의 출력이 생성됩니다. 또한 각 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