다음과 같은 파일이 있습니다
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와 일치하지 않는 ID를 필터링할 수 있다고 생각했습니다.
awk '{if($2 != $3 || $2 != $4) print $0}' mergedlist > nonmatchlist
그리고
awk '{if($2 == $3 || $2 == $4) print $0}' mergedlist > matchlist
그러나 이는 하나의 변수(전자의 경우 T, 후자의 경우 A)에만 작동합니다.
답변1
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
알아내는 데 시간이 더 걸릴 것입니다.
답변2
당신은연관 배열보완적인 조회 테이블, 예:
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
답변3
@steeldriver가 제안한 배열 외에도 함수를 정의할 수도 있습니다.
awk '
BEGIN { FS == " +" }
NR == 1 {print $0 }
function CHANGE( F )
{
if ( F == "A" ) F = "T"
else if ( F == "T" ) F = "A"
else if ( F == "C" ) F = "G"
else F = "C"
return F
}
NR >= 2 {
if ( $2 == $3 || $2 == $4 ) print $0
else {
$3=CHANGE($3)
$4=CHANGE($4)
printf "%5d%3s%3s%3s\n",$1,$2,$3,$4
}
}
' file