열의 짧은 반복 단어를 숫자로 변환

열의 짧은 반복 단어를 숫자로 변환

열의 짧은 반복 단어를 숫자로 변환하고 싶습니다.

(with ONLY 2 LETTERS)아래 예에서는 3열의 단어를 숫자로 변경하여 , 또는 , 또는 으로 AA변경할 수 있도록 하고 싶습니다 .2ABBA1BB0

첫 번째 및 두 번째 열에는 AA, BB및 도 포함될 수 있습니다 AB. BA이는 변경되어서는 안 됩니다.

" "열은 ()로 구분됩니다.

Id_animal Id_SNP Allele
ID01 rs01 AB
ID02 rs01 BA
ID03 rs01 AA
ID04 rs01 BB

원하는 출력은 다음과 같습니다.

Id_animal Id_SNP Allele
ID01 rs01 1
ID02 rs01 1
ID03 rs01 2
ID04 rs01 0

답변1

sed -i.bak -r 's/ AA$/ 2/;s/ (AB|BA)$/ 1/;s/ BB$/ 0/' input
  • -i.bak제자리에서 편집하고 원본 파일의 백업 생성input.bak
  • -r확장된 정규식 구문
  • s/ AA$/ 2/"AA"의 끝 문자 시퀀스를 2로 바꿉니다.
  • (AB|BA)AB 또는 BA
  • ;별도의 교체 작업 분리

답변2

그리고 awk:

awk 'BEGIN {                                     
        t["AA"] = 2
        t["AB"] = t["BA"] = 1
        t["BB"] = 0
    }       
    $3 ~ /^[AB][AB]$/ { $3 = t[$3] }
    1' data.txt

답변3

시도하고 있는 Perl 솔루션을 추구하려는 경우 한 가지 방법은 다음을 사용하는 것입니다.해시시간단한 조회 테이블로, 예를 들어

%table = ("AA" => 2,"AB" => 1,"BA" => 1,"BB" => 0)

그런 다음 해당 값을 @F[2]키로 사용하십시오. 예를 들어

perl -alne '
  %table = ("AA" => 2,"AB" => 1,"BA" => 1,"BB" => 0); 
  print $.==1? $_ : join " ", @F[0,1], $table{@F[2]}
' file
Id_animal Id_SNP Allele
ID01 rs01 1
ID02 rs01 1
ID03 rs01 2
ID04 rs01 0

실제로는 있기는 하지만Perl을 사용하여 설명하는 간단한 사례를 수행하는 방법 tr- 음역 수를 반환하므로. 따라서 반환 값을 사용하여 tr /A//As의 수를 계산할 수 있습니다.

perl -alne 'print $.==1? $_ : join " ", @F[0,1], @F[2] =~ tr/A//' file
Id_animal Id_SNP Allele
ID01 rs01 1
ID02 rs01 1
ID03 rs01 2
ID04 rs01 0

훨씬 더 간단합니다(분할 및 연결 대신 정규식을 사용하여 대상 문자열을 식별함).

perl -pe 's/\b[AB]{2}\b/$& =~ tr{A}{}/ge' file


awk즉, 동일한 트릭을 사용할 수 있습니다.

awk 'FNR>1 {$3 = gsub(/A/,"",$3)}1' file

관련 정보