아래와 같이 거대한 vcf.gz 파일에 무엇이 있는지 모르겠습니다.
CHROM POS ALT 12345
1 345632 T 0/1:4,4:8:99:105,0,106
4 032184 C 1/1:46,9:55:99:99,0,1222
6 843290 A 0/1:67,20:87:99:336,0,1641
7 743290 C 0/1:37,20:57:99:336,0,2641
8 329283 T 0/2:99:21:253,0,290:11,10
9 789320 C 2/2:99:21:253,0,290:11,10
다 추출하고 싶다고유한":" 앞에 있는 네 번째 열의 값입니다. 이 경우는 다음과 같습니다.
0/1
1/1
0/2
2/2
추천 메뉴가 무엇인가요?
답변1
다음을 사용하여 awk
네 번째 열의 형식이 올바른지 확인하세요 .
awk 'match($4, /^[0-9]+\/[0-9]+:/) {
c = substr($4, RSTART, RLENGTH-1)
if (!seen[c]++) print c
}'
답변2
문자로 시작하는 줄은 주석이거나 무시된다고 가정합니다.
zcat vcf.gz | awk \
'BEGIN {
RS = "[\t\v\f ]*(\r\n|\n\r|\r|\n)" ;
FS = "[\t\v\f ]+"
}
/^[A-Za-z]/ {
next
}
NF >= 4 {
key = $4 ;
sub(/:.*$/, "", key) ;
seen[key]++
}
END {
for (key in seen)
printf "%s\n", key
}'
\
이를 위해 필요한 세미콜론을 모두 추가했으므로 전체 명령을 한 줄에 작성할 수 있습니다( 단, 첫 번째 줄의 끝은 제거).
이 BEGIN
규칙은 범용 개행 지원을 설정합니다. 모든 후행 공백은 무시되며 모든 형태의 개행(CR, LF, CRLF, LFCR)이 개행으로 허용됩니다. 탭이나 공백의 수는 필드 구분 기호로 간주됩니다.
이 규칙은 /^[A-Za-z]/
문자로 시작하는 모든 줄에 적용됩니다. 이로 next
인해 무시됩니다.
다음 규칙은 필드가 4개 이상인 모든 레코드(행)에 적용됩니다. 네 번째 필드가 변수에 복사된 key
다음 첫 번째 콜론 뒤의 모든 내용(및 포함)이 삭제됩니다. 결과 값을 연관 배열의 키로 사용합니다 seen
. 우리가 할당하는 값은 중요하지 않지만 여기에는 seen[key]
각 값이 참조되는 횟수(1 이상)가 포함됩니다.
END
모든 입력이 처리된 후에 규칙이 실행됩니다 . 여기서 루프는 seen[]
배열의 키를 (지정되지 않은 순서로) 반복하고 키만 인쇄합니다.
데이터의 순서를 유지하거나 키에 특정 순서를 사용하려면 위의 코드 조각을 약간 수정해야 합니다.
답변3
perl
문제가 없는 경우 :
$ perl -lane '($k) = $F[3] =~ m/^([^:]+)/; print $k if !$seen{$k}++ && $. > 1' ip.txt
0/1
1/1
0/2
2/2
($k) = $F[3] =~ m/^([^:]+)/
:
열 4 앞의 문자열을 가져옵니다.- 고유하고 첫 번째 줄이 아닌 경우 인쇄합니다(헤더를 피하기 위해).
이전 패턴이 :
패턴이어야 하는 경우 digits/digits
일치 항목을 다음으로 변경합니다.m|^(\d+/\d+):|
답변4
나는 다음을 사용할 것이다:
grep -o -P '.{1}/.{1}' file
귀하의 경우:
zcat vcf.gz | grep -o -P '.{1}/.{1}'
편집: 한 번만 발생하며 줄 끝에 uniq를 추가합니다.
zcat vcf.gz | grep -o -P './.' |
또는 순서대로 원하는 경우:
zcat vcf.gz | grep -o -P './.' |