CSV para html com codificação dinâmica de cores

2

Eu escrevi o script de shell abaixo para converter csv para HTML com código de cores para um único arquivo e está funcionando corretamente. A condição para a codificação por cores é diferente para diferentes relatórios (arquivos csv), então eu queria torná-la dinâmica em vez de codificar a condição.

Este é o meu código atual para um relatório:

cd /gk/laaz/

ipfile=$1
opfile=$2
condition=$3

awk -v cond="$condition" 'BEGIN{

FS="|"
  print "<html><body></br></br>The report .</br></br></br>"
  print "<table border=1 cellspacing=1 cellpadding=1>"
}

NR==1 {
  # Header row
  print "<tr>"

  for ( i = 1; i <= NF; i++ ) {
    print "<td><b>"$i"</b></td>"
  }
  print "</tr>"
}

NR>1 {
  # Data rows
  print "<tr>"
  color="RED"

  for ( i = 1; i < NF; i++ ) {
color="RED"
if( $1=="180817CR0003988" ) {
    color="BLUE"
    }

   print "<td><b><FONT COLOR=\""color"\" FACE=\"verdana\" SIZE=2>"$i"</b></FONT></td>"
  }
 print "</tr>"
}
END {
  print "</table></body></html>"
}
' $ipfile >> $opfile
fi

Nesse código, quero usar a awkvariável condna ifinstrução, mas não está funcionando.

Este código está funcionando:

if( $1=="180817CR0003988" ) {
    color="BLUE"
    }

Mas isso não é:

if( cond ) {
    color="BLUE"
    }

Eu inicio o script com:

/gk/laaz/csv2html.sh sample.csv sample.html "\$1==\"180817CR0003988\""
gaurav_hodade
fonte
Qual é o terceiro parâmetro que você está passando para o script?
Jesse_b 10/01
condição para o relatório ... como se a primeira coluna fosse igual a $ 1 == "180817CR0003988", use a cor vermelha para essa linha.
gaurav_hodade 10/01
1
Sim, mas o que é isso? Qual é o valor de condquando if( cond )é executado? Por favor, edite sua pergunta e mostre o comando que você usa para iniciar o script, incluindo esta variável.
terdon
eu corro abaixo do comando /gk/laaz/csv2html.sh sample.csv sample.html "\ $ 1 == \" 180817CR0003988 \ ""
gaurav_hodade 10/01
Eu sugiro que você edite a pergunta do título como "teste de condição awk para centenas de arquivos"
Archemar 10/01

Respostas:

0

não use uma variável

O awk permite múltiplos arquivos de programa de entrada.

gere um arquivo awk temporário para todos os casos, como:

para file1.csvgerar um temporary.awkprograma (file1.awk)

function check() { if ( $1 == ""180817CR0003988" ) return "blue" ; else "back" }

para fileX.csv

function check() { if ( $9 == ""unix.stackexchange.com" ) return "grey" ; else "blue" }

então em uso de chamada

color=check() ;

awk sendo chamado como

awk -f temporary.awk -f long.awk ...

declaração da sua awk sendo grande, eu sugiro colocá-lo em um arquivo chamado long.awk.

Archemar
fonte
2

Variáveis ​​awk são tratadas como strings. Você não pode nem passar uma matriz , muito menos uma condição. Mas você não precisa. Em vez de passar a condição, basta passar o valor necessário para executar:

if( $1 == cond ) {
    color="BLUE"
}

Em seguida, inicie o script com:

/gk/laaz/csv2html.sh sample.csv sample.html 180817CR0003988
terdon
fonte
Olá, mas existem 100 relatórios e cada coluna será diferente. Como neste caso, a codificação por cores dependia do valor da coluna número 1. Mas, para outros relatórios, a coluna seria 2 ou 3 ou outra coisa. Portanto, não posso codificá-lo com if ($ 1 == cond) {color = "BLUE"}.
gaurav_hodade 10/01
@gaurav_hodade, edite sua pergunta e deixe isso claro. Para poder ajudá-lo, precisamos conhecer todos os seus requisitos, não podemos adivinhar.
terdon
para adicionar às respostas do terdon, as strings não podem ser usadas como declaração, por exemplo, cond=$1=="foo"não podem ser passadas como variáveis ​​para trigerrìf ($ 1 == "foo") `no awk.
Archemar 10/01