문서:
chromosome position ref alt
chr1 1398 A T
chr1 2980 A C
chr2 3323 C T,A
chr2 3749 T G
chr3 5251 C T,G
chr3 9990 G C,T
chr4 10345 T G
4열에 쉼표로 구분된 문자가 2개 이상인 경우 전체 행을 추출해야 합니다.
예상되는 출력은 다음과 같습니다.
chr2 3323 C T,A
chr3 5251 C T,G
chr3 9990 G C,T
답변1
이 문제를 보는 몇 가지 다른 방법이 있습니다.
방법 1
쉼표로 구분된 문자가 2개 이상 포함된 줄에만 관심이 있으므로 grep
쉼표만 사용하면 됩니다.
$ grep "," sample.txt
chr2 3323 C T,A
chr3 5251 C T,G
chr3 9990 G C,T
방법 #2
사용할 수 있는 grep
PCRE 도구 . 여기서 grep
일치를 위해 Perl의 정규식 엔진을 사용할 수 있습니다. 이것은 매우 강력하며 Perl로 할 수 있는 많은 일을 할 수 있게 해줍니다 grep
.
느슨하게 정의됨
$ grep -P "(\w,)+" sample.txt
엄격한 정의
$ grep -P '\w+\d\s+\d+\s+\w\s+(\w,)+' sample.txt
방법 #3
사용 awk
. 이는 쉼표( )가 있는 줄만 의미가 있다는 사실을 다시 활용하므로 ,
해당 줄을 찾아 인쇄합니다.
느슨하게 정의됨
$ awk '/,/{print}' sample.txt
더 엄격한 정의
$ awk '/([[:alpha:]])+,[[:alpha:]]/{print}' sample.txt
더욱 엄격한 정의
$ awk '$4 ~ /([[:alpha:]])+,[[:alpha:]]/{print}' sample.txt
이 명령은 네 번째 열의 내용을 보고 문자, 쉼표, 또 다른 문자인지 확인합니다.
더욱 엄격한 정의
$ awk '$4 ~ /([GATC])+,[GATC]/{print}' sample.txt
이는 G, A, T 또는 C만 찾고 그 뒤에 쉼표가 오고 또 다른 G, A, T 또는 C가옵니다.
답변2
perl -ane 'print if($F[3] =~ /^\w,\w/$);' file
-n
Perl에게 infile을 한 번에 한 줄씩 처리하고 각 줄을 에 지정된 명령에 전달하도록 지시합니다 -e
. -a
Perl에게 필드 구분 기호(기본적으로 공백) 주위의 각 줄을 확장하고 이를 이름이 지정된 배열에 할당하도록 지시합니다 @F
. 결과적으로 우리는 각 행을 처리하고 이를 사용하여 $F[n]
행의 n번째 요소를 참조할 수 있습니다.
$F[3]
그런 다음 필드 4 에 문자열의 시작 ^
, 단어 문자 \w
, 쉼표, 다른 단어 문자 \w
, 문자열의 끝이 포함되어 있는지 테스트합니다 $
. 성공하면 print
오프라인 상태입니다.
이러한 "단어 문자"가 항상 시토신, 아데닌, 구아닌 및 티민인 경우 다음을 사용하여 더 명확하게 만들 수 있습니다.
perl -ane 'print if($F[3] =~ /^[GATC],[GATC]$/);' file
답변3
또 다른 awk 솔루션.
awk 'length($4) > 2 && $4 ~ /^([^,],)+[^,]$/' file_name
테스트에는 nawk를 사용하고 gawk와 함께 사용할 수도 있습니다. 이는 A,T,G,C,Z,Q,R과 일치합니다.
마찬가지로 ATGC와 일치하는 경우:
awk 'length($4) > 2 && $4 ~ /([ATGC],)+[ATGC]/' file_name
답변4
간단한 awk
문장:
awk '$4 ~ ","' file