Analisando arquivo de texto complexo usando comandos Unix

1

Eu tenho a seguinte estrutura de texto que gostaria de analisar:

>Cluster 423
0   56aa, >HWI-ST1448:257:C3V2HACXX:1:1106:19087:2550.1... at 92.86%
1   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1... *
2   41aa, >HWI-ST1448:257:C3V2HACXX:1:1106:12438:91360.3... at 90.24%
3   45aa, >HWI-ST1448:257:C3V2HACXX:1:1108:13046:13861.1... at 91.11%
4   52aa, >HWI-ST1448:257:C3V2HACXX:1:1110:12260:2424.2... at 90.38%
>Cluster 434
0   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1... *
1   46aa, >HWI-ST1448:257:C3V2HACXX:2:1312:1967:40935.2... at 97.83%

Basicamente, o identificador é marcado com * no final e o tamanho do grupo é o último número de grupo +1.

A saída que eu quero produzir seria (anote o tamanho do grupo no final):

HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1      5
HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1      2

Alguma idéia?

    
por BSP 10.09.2014 / 21:12

4 respostas

1

Aqui está um corte um pouco aproximado (sem tratamento de erros):

awk '/\*$/   { save_id = substr($3, 2, length($3)-4) }
    /^[0-9]/ { save_num = $1 }
    NR > 1 && /^>/ {print save_id, save_num+1 }
    END  {print save_id, save_num+1 }
    ' data_file
  • Em uma linha que termina com * (ou seja, que corresponde a /*$/ ), extrair o ID do grupo da terceira palavra, descartando o primeiro caractere ( > ) e os últimos três ( ... ).
  • Nas linhas que começam com um número, salve o número (ou seja, a primeira palavra).
  • Ao encontrar uma linha que começa com > (mas excluindo a primeira linha no arquivo especificando NR > 1 ) ou o final do arquivo, saída os valores salvos apropriados.
por 10.09.2014 / 21:40
1
perl  -F'\n' -lan00e 'print "$1\t$#F" if />(.*)\.{3} \*$/m'
    
por 10.09.2014 / 22:12
1
sed '/^[>0-9]/h;s/.*>\(.*[0-9]\).*\*/[ ]P /p
     $s/.*//;/^[>0-9[]/d;g;s/ .*/ 1+pc/ 
' <<\DATA | dc
>Cluster 423
0   56aa, >HWI-ST1448:257:C3V2HACXX:1:1106:19087:2550.1... at 92.86%
1   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1... *
2   41aa, >HWI-ST1448:257:C3V2HACXX:1:1106:12438:91360.3... at 90.24%
3   45aa, >HWI-ST1448:257:C3V2HACXX:1:1108:13046:13861.1... at 91.11%
4   52aa, >HWI-ST1448:257:C3V2HACXX:1:1110:12260:2424.2... at 90.38%

>Cluster 434
0   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1... *
1   46aa, >HWI-ST1448:257:C3V2HACXX:2:1312:1967:40935.2... at 97.83%
DATA

OUTPUT

HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1 5
HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1 2

É bem simples. Ele mantém uma cópia do primeiro número na linha para qualquer linha com um caractere. Ele só imprime se conseguir remover o * como o último caractere em uma linha ou se a linha não começar com >0-9 . Na última linha, todos os caracteres são removidos. Portanto, dc obtém uma [ stuff here ] string para p per Cluster e um pequeno trabalho de adição quando, em linhas em branco, sed obtém o número salvo.

    
por 10.09.2014 / 22:27
0
 grep "\*" file.txt |grep -E "(?<=>)[\w+\s\W]+"|sed 's/\.\.\.\*//'
    
por 10.09.2014 / 22:17