다음과 같은 파일이 있습니다.
1 rs6687776 1020428 T C T C T C C C T C C C T C
네 번째와 다섯 번째 열은 두 가지 다른 가능성이 있습니다.대립유전자그 웹사이트에서. 대립 유전자가 0
있는지 T
, 대립 유전자가 1
있는지 표시하려면 열 6을 변경해야 합니다 C
. 내 파일은 20805 x 459입니다. 따라서 다음과 같아야 합니다.
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1
나는 시도했다:
cat file | while read line
do if [ [,6-] = [,4] ]
then
echo "0"
echo "1"
fi
done
그러나 나는 길이가 41610 줄인 0
및 가 교대로 구성된 파일 로 끝났습니다 . 1
아마도AWK더 유용한?
답변1
또 다른 접근 방식은 다음과 같습니다 awk
.
$ awk '{a[$4]=0;a[$5]=1; for(i=6;i<=NF;i++){$i=a[$i]}}1;' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1
설명하다
a[$4]=0;a[$5]=1;
a
$4
: 두 개의 키 와 을 사용하여 배열을 만듭니다$5
. 의 값은$4
으로 설정되고0
의 값은$5
1로 설정됩니다.for(i=6;i<=NF;i++){$i=a[$i]}
: 6부터 마지막까지의 각 필드 번호에 대해 발견된 뉴클레오티드 배열에 저장된 값으로 필드를 설정합니다.1;
: awk는 "이 줄 인쇄"의 약어입니다.
Perl을 사용하여 이 작업을 수행할 수도 있습니다.
$ perl -lane 's/$F[3]/0/ for @F[5..$#F]; s/$F[4]/1/ for @F[5..$#F]; print "@F"' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1
같은 생각이에요. make는 공백의 각 줄을 배열로 분할하는 것을 좋아 -a
합니다 . 그런 다음 4번째 필드( , 배열은 0에서 시작) 에서 발견된 뉴클레오티드의 모든 케이스를 로 바꾸고 , 5번째 필드( ) 의 모든 케이스를 로 바꿉니다 . 이는 대체가 필드 6부터 끝까지만 적용된다는 의미입니다. 마지막으로 수정된 배열을 인쇄합니다.perl
awk
@F
$F[3]
0
$F[4]
1
for @F[5..$#F]
답변2
다음을 시도해 볼 수 있습니다 awk
.
awk '{ for (i = 6; i <= NF; i++) { if ($i == $4) { $i = 0; } else if ($i == $5) { $i = 1; } } } 1' file
또는:
awk '{ for (i = 6; i <= NF; i++) { $i = ($i == $4) ? 0 : 1; } } 1' file
답변3
이를 수행하는 방법은 항상 여러 가지가 있습니다. sed는 Unix 스트림 편집기입니다. 다음과 같이 입력을 수정하는 데 유용합니다.
while read one two three four five rest
do
echo $one $two $three $four $five $(echo $rest | sed -e 's/T/0/g' -e 's/C/1/g')
done < input
-e 플래그는 구문 분석할 표현식을 제공합니다. "s" 함수는 첫 번째 인수(T 또는 C)를 검색하여 두 번째 인수(0 또는 1)로 바꿉니다. sed에 여러 표현식을 제공하여 여러 작업을 수행할 수 있습니다. 루프의 나머지 부분에서는 처음 5개 필드만 유지합니다.