使用awk从文件中提取特定数据

时间:2014-06-17 15:38:06

标签: awk

我有一个文本文件,如下所示。我想提取.pdb ID及其相应的链。如何使用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

2 个答案:

答案 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价值感到满意: >:| 就像一张可爱的脸!

答案 1 :(得分:1)

看起来好像你想要按原始顺序输出所有内容;所以,需要一些间接来处理这个问题。下面的所有内容都按照要求在POSIX AWK中工作(或者至少是LINT = 1的gawk),并且具有跟踪可以消除重复的内容的附加功能。

#! /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]
}