2014-06-17 3 views
-1

다음과 같이 텍스트 파일이 있습니다. .pdb ID와 해당 체인을 추출하고 싶습니다. awk으로 어떻게 가능합니까?awk를 사용하여 파일에서 특정 데이터를 추출하십시오.

>4HSU:A|PDBID|CHAIN|SEQUENCE 
PLGSRKCEKAGCTATCPVCFASASERCAKNGY 
PKAFMADQQL 
>4HSU:B|PDBID|CHAIN|SEQUENCE 
PLGSPEFSERGSKSPLKRAQETE 
>4HSU:C|PDBID|CHAIN|SEQUENCE 
ARTMQTARKSTGGKAPRKQLATKAARKSAP 
>4HT3:A|PDBID|CHAIN|SEQUENCE 
MERYENLFAQLNDRREGAF 
>4HT3:B|PDBID|CHAIN|SEQUENCE 
MTTLLNPYFGEFGGMYVPQ 
>4I0W:A|PDBID|CHAIN|SEQUENCE 
MENKAKVGIDFINTIPKQILTSLIEQYSPNNGEIELVVLYGDNFLRFKNSVDVIGAKVEDLGYGFGILII 
>4I0W:B|PDBID|CHAIN|SEQUENCE 
AYDSNRASCIPSVWNNYNLTGEGILVGFLDT 
>4I0W:D|PDBID|CHAIN|SEQUENCE 
AYDSNRASCIPSVWNNYNLTGEGILVGFLLPLGDTITSGGWRIIVRKLNNYEGYFDIWLPIAEGLN 
ERTRFLQPSVYNTLGIPATVEGVIS 
` 

원하는 출력 :

4HSU A B C 
4HT3 A B 
4I0W A B D 
+0

특히 해봤습니까? – Runcorn

+0

당신이 시도한 것을 보여줄 수 있습니까? –

답변

2
kent$ awk -F'[>:|]' '/^>/{a[$2]=a[$2] OFS $3}END{for(x in a)print x,a[x]}' file 
4I0W A B D 
4HSU A B C 
4HT3 A B 

FS 값에 만족 : 귀여운 얼굴과 같은 >:|!

+0

대단히 감사합니다 !! – user3749185

1

원래 순서대로 모든 항목의 출력을 원하는 것처럼 보입니다. 그래서, 이것을 처리하기 위해 간접적 인 지시가 필요합니다. 아래의 모든 것은 POSIX AWK에서 요청한대로 (또는 적어도 LINT = 1로 도용) 작동하며 중복을 제거하기 위해 보이는 것을 추적하는 부가 기능이 있습니다.

#! /usr/bin/awk -f 

BEGIN { 
     FS="[>:|]" 
     split("", t)  # table of output 
     split("", r)  # row number in table for a ID 
     split("", seen) # keeps track of duplicates 
     row=0 
} 

/^>/ && !($2 SUBSEP $3 in seen) { 
     if ($2 in r) { 
       i=r[$2] 
       t[i] = t[i] OFS $3 
     } else { 
       r[$2] = row 
       t[row++] = $2 OFS $3 
     } 
     seen[$2, $3] = 1 
} 

END { 
     for (i=0; i<row; i++) 
       print t[i] 
} 
관련 문제