열의 짧은 반복 단어를 숫자로 변환하고 싶습니다.
(with ONLY 2 LETTERS)
아래 예에서는 3열의 단어를 숫자로 변경하여 , 또는 , 또는 으로 AA
변경할 수 있도록 하고 싶습니다 .2
AB
BA
1
BB
0
첫 번째 및 두 번째 열에는 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