Como imprimir uma string no final da linha usando o awk?

0

Eu sou muito novo no awk. Eu estou tentando adicionar uma nova coluna calculada. Mas awk insere a coluna na próxima linha, em vez do final da linha atual.

Aqui está um exemplo dos meus dados:

,2013-11-22,12.9,26.0,26.6,,,NW

O que eu estou tentando fazer é adicionar uma coluna no final contendo YES, ou NO com base na quinta coluna (se $ 5 > 0 YES mais NÃO).

Aqui está o meu comando awk:

awk -F, '{
    if($5 > 0) print $0, ",YES"; else print $0, ",NO"
}' data.csv

O resultado é algo assim:

,2013-11-22,12.9,26.0,26.6,,,NW
YES

Como posso corrigir isso?

    
por bman 25.07.2014 / 07:07

2 respostas

2

Você pode atribuir diretamente a campos em awk com $N , para N o número do campo: $9 = "YES" adicionará um novo campo no final com o valor "YES" :

awk -F, -v OFS=, '{ if ($5 > 5) { $9 = "YES" } else {$9 = "NO"} };1' data

Quando atribuímos a $9 , criamos o nono campo, que é um além do final para esses dados. Colocar 1 no final força a saída padrão de awk a ocorrer, o que teria sido suprimido de outra forma.

Para sua amostra, o texto acima fornece:

,2013-11-22,12.9,26.0,26.6,,,NW,YES

que eu acho que é o que você queria.

Se você quiser que seja o último campo, independentemente de quantos campos havia para começar, podemos usar o número de campos NF , certificando-nos de ir além dele:

awk -v OFS=, -F, '{ if ($5 > 5) {$(NF+1)="YES"} else {$(NF+1)="NO"} };1' data

$ aceita qualquer expressão numérica, portanto, podemos adicionar uma a NF para obter acesso ao próximo campo disponível.

    
por 25.07.2014 / 07:13
2

Uma solução awk mais curta:

$ awk -F',' '$(NF+1) = $5 > 0 ? "YES" : "NO"' OFS=',' file

Se o seu arquivo contiver windows newline character, você poderá removê-lo:

$ awk -F',' '{sub(/\r$/,"")} $(NF+1) = $5 > 0 ? "YES" : "NO"' OFS=',' file
    
por 25.07.2014 / 07:30

Tags