awk를 사용하여 두 배열의 값을 비교하고 인쇄합니다.

awk를 사용하여 두 배열의 값을 비교하고 인쇄합니다.
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

관련 정보