analisando vários campos de um csv com o gawk no solaris

2

Eu tenho um csv gerado que possui o seguinte formato:

unixtime;host_name;ip_adress;description;2;0;1

Eu tenho tentado analisar esse csv para fazer o seguinte:

altere o campo 1 do registro de data e hora do unix para legível por humanos.

altere o campo 5 de 2 para Critical

altere os campos 6 e 7 assim:

se o valor for 0, substitua por NO, se for 1, substitua por yes

Eu consegui fazer os 2 primeiros usando isso:

cat test.csv |
  /opt/csw/bin/gawk -F";" '{OFS=";"; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' |
  /opt/csw/bin/gawk -F";" '{OFS=";"; gsub("2", "CRITICAL", $5)}1'

mas como posso alterar o 1 por sim e o 0 por não nos campos $ 6 e $ 7?

Se eu tentar algo assim, ele substitui todos os lugares que encontrar 0:

gawk 'BEGIN {OFS=FS=";"} {if ($6== "0") gsub ($6,"NO"); print }' sample.csv

Para o registro, estou usando o Solaris e instalei o gawk no opencsw.

    
por user2653557 18.07.2016 / 18:19

1 resposta

2

O seguinte programa gawk deve funcionar para você:

echo -e "unixtime;host_name;ip_adress;description;2;0;1\n1234567890;hName;hIP;hDesc;2;1;0" |
gawk -F";" 'BEGIN {OFS=";"} {
  if (NR<2) next;
  $1=strftime("%Y-%m-%d %H:%M:%S", $1);
  $5=($5==2?"CRITICAL":$5);
  $6=($6?"Yes":"No") ; $7=($7?"Yes":"No") ;
  print}'

2009-02-14 00:31:30;hName;hIP;hDesc;CRITICAL;Yes;No

O principal aqui é que você pode colocar vários comandos em uma chamada awk .

$6=($6?"Yes":"No") ou, mais formalmente (condition?consequence:alternative) , é chamado de operador "ternário" e é uma abreviação de if (condition) consequence else alternative

Se você quiser imprimir a linha de cabeçalho inalterada , não "ignorá-la", você pode escrever if (NR<2) {print;next} ;

Editar: Sugestão de melhoria de desempenho implementada do @cas para mover a atribuição de OFS para um bloco BEGIN.

    
por 18.07.2016 / 19:56