awk 구분 기호로 열 분할

awk 구분 기호로 열 분할

거의 여기서 답을 얻었어요awk를 구분 기호로 나누고 첫 번째 항목을 가져옵니다. 하지만 최종 도움이 필요합니다. 파일이 있습니다:

chr1    283 C       T       0.0     PASS    AF=0.730769;AO=19;DP=26;FAO=19;FDP=26;FDVR=5;FR=.;FRO=7;FSAF=12;FSAR=7;
chr1    296 A       G       0.0     PASS    AF=0.6;AO=6;DP=10;FAO=6;FDP=10;FDVR=10;FR=.;FRO=4;FSAF=3;FSAR=3;
chr1    393 CACA    ACCA    0.0     PASS    AF=0.266667,0.266667;AO=4,4;DP=16;FAO=4,4;FDP=15;FDVR=5,5;FR=.,.,.,.,HEALED,HEALED;FRO=2;FSAF=0,0;FSAR=4,4;

마지막 열을 ";", ","로 분할하고 개별 부분을 추출해야 합니다. AF, FSAF 및 FSAR 항목을 추출하고 싶습니다. 중복된 항목이 있으면 첫 번째 항목을 가져옵니다. 나는 다음을 가지고 있지만 아마도 이것이 최선의 접근 방식은 아닐 것입니다. (그리고 나는 이 모든 것을 같은 줄에서 수행하는 방법을 찾지 못했습니다.)

awk '{split($13,a,/;/); split(a[1],b,/,/); print b[1]}'

awk '{split($13,a,/;/); split(a[9],c,/,/); print c[1]}'

awk '{split($13,a,/;/); split(a[10],d,/,/); print d[1]}' 

답변1

귀하의 질문에서 완전히 명확하지는 않지만 (아래 내 의견 참조) "이중 항목이 첫 번째 항목을 취하는 곳"이라고 가정하면 FOO=bar각 행에 중복 항목이 있다는 것을 의미합니다. 이것이 당신이 원하는 것일 수 있다고 생각합니다. do (모든 Unix 시스템의 모든 쉘에서 awk 사용):

$ cat tst.awk
BEGIN { OFS=";" }
{
    delete f
    n = split($7,subFlds,/;/)
    for (i=1; i<=n; i++) {
        tag = val = subFlds[i]
        sub(/=.*/,"",tag)
        sub(/,.*/,"",val)
        if ( !(tag in f) ) {
            f[tag] = val
        }
    }
    print f["AF"], f["FSAF"], f["FSAR"]
}

$ awk -f tst.awk file
AF=0.730769;FSAF=12;FSAR=7
AF=0.6;FSAF=3;FSAR=3
AF=0.266667;FSAF=0;FSAR=4

물론, 출력 구분 기호의 형식이 OFS요구 사항에 맞지 않으면 원하는 대로 변경할 수 있습니다.

데이터에 태그=값 쌍이 있을 때마다 먼저 값 매핑( f[]위)에 대한 태그 배열(일명 이름)을 생성한 다음 원하는 태그별로 값을 인쇄/테스트/수정/모든 값을 인쇄/테스트/수정할 수 있습니다. 마음에 드는 것을 주문하세요.

위의 방법은 레이블이 입력에서 항상 동일한 순서로 표시되지 않거나 일부 행에서 일부 레이블이 누락되는 경우에도 작동합니다.

관련 정보