VCF 파일의 정보 필드에서 모든 키 가져오기

VCF 파일의 정보 필드에서 모든 키 가져오기

이 질문은 이전 답변과 관련이 있습니다.awk를 구분 기호로 나누고 첫 번째 항목을 가져옵니다.-

VCF 파일(탭으로 구분된 형식)의 경우:

chr1    28374C       T       0.0     PASS    AF=0.730769;AO=19;DP=26;
chr1    29631A       G       0.0     PASS    AF=0.6;AO=6;DP=10;ALLELEID=1396033;
chr1    39322CAC    ACC      0.0     PASS    AF=0.266667,0.266667;AO=4,4;DP=16; 

다음 출력을 얻고 싶습니다.

AF
AO
DP
AF
AO
DP
ALLELEID
AF
AO
DP

예상대로 모든 AF 항목을 가져오지만 awk '{split($6,a,/;/); split(a[1],b,/=/); print b[1]}' file나머지 키를 추출하는 방법을 잘 모르겠습니다. a두 번째 분할에서 전체 내용을 어떻게 전달합니까 ?

답변1

POSIX awk를 사용하십시오.

$ awk -F'[[:space:]=;]+' '{for (i=6; i<NF; i+=2) print $i}' file
AF
AO
DP
AF
AO
DP
ALLELEID
AF
AO
DP

답변2

awk를 사용하십시오.

$ awk '{ n=split($6, tmp, /=[^;]*;/); for(i=1; i<n; i++) print tmp[i] }' infile
AF
AO
DP
AF
AO
DP
ALLELEID
AF
AO
DP

또는 다음과 유사하게 임의의 문자 또는 단일 Split() 호출에서 열 6을 분할합니다.;=

awk '{ n=split($6, tmp, /[=;]/); for(i=1; i<n; i+=2) print tmp[i] }' infile

그런 다음 다음과 같이 키 값을 인쇄할 수도 있습니다.

$ awk '{n=split($6, tmp, /[=;]/); for(i=1; i<n; i+=2) print tmp[i], tmp[i+1] }' infile
AF 0.730769
AO 19
DP 26
AF 0.6
AO 6
DP 10
ALLELEID 1396033
AF 0.266667,0.266667
AO 4,4
DP 16

답변3

파이프로 단순화하자 :

$ awk '{print $6 | "grep -oP \042[A-Z]+(?==)\042"}' file

또는

$ awk '{print $6}' file | grep -oP '[A-Z]+(?==)'
AF
AO
DP
AF
AO
DP
ALLELEID
ID
AF
AO
DP

정규식 일치는 다음과 같습니다.

마디 설명하다
[A-Z]+ 모든 문자: "A" ~ "Z"(1회 이상)
(?= 시야다음이 있는지 확인하세요.
= =
) 미리보기 끝

답변4

awk 및 tr 명령을 사용하십시오.

$ awk '{print $6}' infile | tr "=" ";" | awk -F";" '{for (i=1;i<NF;i++) {if(i%2){print $i}}}'
AF
AO
DP
AF
AO
DP
ALLELEID
AF
AO
DP

관련 정보