Imprime colunas que começam com uma string específica

8

Eu tenho um arquivo parecido com isto:

ID101     G    T     freq=.5     nonetype     ANC=.1     addinfor
ID102     A    T     freq=.3     ANC=.01    addinfor
ID102     A    T     freq=.01     type=1     ALT=0.022    ANC=.02    addinfor

Como você pode ver, cada linha tem um número de colunas ligeiramente diferente. Eu quero especificamente a coluna 1, coluna 2, coluna 3, coluna 4 e a coluna que começa com ANC=

Saída desejada:

ID101     G    T     freq=.5     ANC=.1
ID102     A    T     freq=.3     ANC=.01
ID102     A    T     freq=.01    ANC=.02

Eu geralmente uso o comando awk para analisar arquivos:

awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}'

Existe uma maneira fácil de alterar este comando para trabalhar em situações como essa?

Acho que algo assim pode funcionar:

awk '{for(j=1;j<=NF;j++){if($j~/^ANC=/){print $j}}}'

No entanto, como posso editar isso para também imprimir as primeiras colunas?

    
por cosmictypist 23.08.2016 / 14:21

3 respostas

12

com awk :

awk '{for(i=5;i<=NF;i++){if($i~/^ANC=/){a=$i}} print $1,$2,$3,$4,a}' file
  • for(...) faz um loop em todos os campos, começando com o campo 5 ( i=5 ).
    • if($i~/^ANC=/) verifica se o campo começa com ANC=
    • a=$i se sim, defina a variável a para esse valor
  • print $1,$2,$3,$4,a campos de impressão 1-4 seguidos de qualquer coisa que esteja armazenada em a .

Pode ser combinado com BEGIN {OFS="\t"} , claro.

    
por 23.08.2016 / 14:30
0

Supondo que a coluna ANC= é sempre a penúltima coluna (como nos dados do exemplo):

$ awk '{ print $1, $2, $3, $(NF-1) }' data.in
ID101 G T ANC=.1
ID102 A T ANC=.01
ID102 A T ANC=.02

NF é o número de campos (colunas) que awk divide cada registro (linha) em. $(NF-1) é o valor do segundo ao último campo.

    
por 12.03.2017 / 10:22
0
perl -pale '$"="\t", $_="@{[@F[0..3],         grep {   /^ANC=/ } @F[4..$#F]]}"' yourfile
perl -lane '$,="\t",          print @F[0..3], grep {   /^ANC=/ } @F[4..$#F]'    yourfile
perl -lane '($,,$a)=("\t",0), print grep { $a++ < 4 or /^ANC=/ } @F'            yourfile

Breve

$, = > OFS @F[0..3] = > $F[0] $F[1] $F[2] $F[4]

    
por 12.03.2017 / 10:44