Como adicionar o número em uma coluna com base nos números de outras colunas

1

Eu tenho um conjunto de dados delimitado por tabulação, como:

#1 2      3   4  5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 10024 10395 41 K + 2 1 1 12 14  5  0  0  3  1  3  6 2 
1 10679 10795 51 P + 2 1 1 15 14  3  0  0  2  1  2  3 1 

Eu quero adicionar mais uma coluna ($ 20) para armazenar os valores com base na coluna 7-19: se o número em uma coluna não for igual a 0, então mais um. Saída esperada:

#1 2      3   4  5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 10024 10395 41 K + 2 1 1 12 14  5  0  0  3  1  3  6 2  11
1 10679 10795 51 P + 2 1 1 15 14  3  0  0  2  1  2  3 1  11

Como escrever o comando usando o awk?

    
por MagicPants 03.08.2017 / 10:25

2 respostas

2

Você pode iterar pelos campos a partir do 7º, verificar se o valor do campo é 0; se não, continue incrementando o 20º campo em 1:

awk -F '\t' 'NR==1 {$(NF+1)=NF+1; print; next}; \
            {for(i=7; i<NF; i++) if ($i != 0) $20++}; 1' OFS='\t' file.txt

Para o primeiro registro ( NR==1 ), adicionou um cabeçalho de campo extra como o último campo com a adição de 1 ao atual NF .

    
por 03.08.2017 / 10:35
0
perl -aF'\t' -lpe '$_ .= "\t" . ($. == 1 ? @F+1 : grep $_, @F[6..$#F])' data.set

Como precisamos adicionar outro campo no final da linha, usamos o operador .= no registro atual $_ . Para o caso especial do 1º registro, simplesmente anexamos a expressão @F+1 , que é interpretada no contexto escalar para significar o número atual de campos mais 1.

Para os registros que não são de cabeçalho, a expressão grep $_, @F[6..$#F] significa iterar sobre o sétimo elemento para a última da matriz @F (que é gravada no registro usando o separador de campo da guia, especificada por meio do -F'\t' Em um contexto escalar, ele retorna o número de vezes que a condição, no nosso caso, é um $_ solitário, para significar elementos diferentes de zero, na fatia 7a ... até o último elemento.

Resultado

#1 2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
1  10024 10395 41 K  +  2  1  1  12 14 5  0  0  3  1  3  6  2  11
1  10679 10795 51 P  +  2  1  1  15 14 3  0  0  2  1  2  3  1  11
    
por 03.08.2017 / 12:07