Altera a cor do fundo (formato html) se um número for menor que um limite

1

Eu tenho o arquivo seguinte, chamado test.html:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="generator" content="SQL*Plus 12.2.0">
<style type='text/css'> body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} p {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} table,tr,td {font:10pt Arial,Helvetica,sans-serif; color:Black; background:#f7f7e7; padding:0px 0px 0px 0px; margin:0px 0px 0px 0px;} th {font:bold 10pt Arial,Helvetica,sans-serif; color:#336699; background:#cccc99; padding:0px 0px 0px 0px;} h1 {font:16pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; border-bottom:1px solid #cccc99; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px;-
} h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif; color:#663300; background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;}</style><title>SQL*Plus Report</title>
</head>
<body>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
NAME
</th>
<th scope="col">
FREE_PERCENT
</th>
</tr>
<tr>
<td>
DG_BACKUP
</td>
<td>
50%
</td>
</tr>
<tr>
<td>
DG_DATA
</td>
<td>
96%
</td>
</tr>
<tr>
<td>
DG_INDEX
</td>
<td>
80%
</td>
</tr>
<tr>
<td>
DG_ORA
</td>
<td>
19%
</td>
</tr>
</table>
<p>
<br>
</body>
</html>

Eu quero encontrar os valores que são menores que 20% e definir o plano de fundo para vermelho:

<td bgcolor="red">

usando sed ou qualquer outra ferramenta. Então, por exemplo,

<td>
80%
</td>

permaneceria inalterado, mas

<td>
19%
</td>

ferida ser mudada para

<td bgcolor="red">
19%
</td>

Script que tentei até agora.

number_of_lines_test=('grep -n % test.html |sed -e '1d' |awk -F"[:%]" '{if ($2 <= 50) print $1}'')
for i in 'seq 0 $((${#number_of_lines_test[@]} - 1))'
do
sed -i -e "$((${number_of_lines_test[i]} - 1))s/<td>/<td bgcolor=\"red\">/" test.html
done
    
por ammar 25.06.2018 / 13:05

2 respostas

0

Tente isso,

number=('grep -n "^[0-1][0-9]" test.html | awk -F ':' '{a=$1-1;print a}'')
for i in ${number[@]} 
do
  sed -i "$i s/.*/<td bgcolor=\"red\">/" test.html
done
    
por 25.06.2018 / 20:43
0

Suponho que você entenda que sua solução e a resposta do SivaPrasath , executar sed once para cada linha de dados que precisa ser alterada (além de executar grep e awk uma vez e, no seu código, um sed extra).

  • awk e sed são comandos muito poderosos. Você quase nunca os usa juntos ou junto com grep .
  • awk sabe sobre números de linha. Se você se encontrar usando grep -n para gerar números de linha, e, em seguida, processando-os com awk , você provavelmente está fazendo mais trabalho para si mesmo do que precisa.
  • Executar comandos leva tempo. Se o seu arquivo tiver 100 linhas, você provavelmente não notará a quantidade de tempo que a resposta do SivaPrasath leva. Se o seu arquivo tem um milhão de linhas, A resposta do SivaPrasath será executada sed aproximadamente 125.000 vezes. Isso provavelmente será perceptível e desnecessário.

Se o "valor" sempre estará no formato NN% , onde NN é um número inteiro decimal de dois dígitos entre 00 e 19 , você pode fazer tudo com esse comando sed :

sed '/<td>/ { N; s/\(<td\)\(>\n[01][0-9]%\)/ bgcolor="red"/; }' test.html

Quando vir uma linha que contenha <td> , ele executa os comandos nas chaves {} . N lê a próxima linha do arquivo (aquela que contém o valor) e acrescenta-o ao espaço do padrão. Em seguida, ele faz um s (substituto) que substitui <td> por <td bgcolor="red"> se o valor (porcentagem) corresponder a [01][0-9] (ou seja, 00 a 19 ).

Se o valor puder ser um único dígito (por exemplo, 0 a 9 em vez de 00 a 09 ), use

sed '/<td>/ { N; s/\(<td\)\(>\n[0-9]%\)/ bgcolor="red"/; s/\(<td\)\(>\n[01][0-9]%\)/ bgcolor="red"/; }'

que é a mesma lógica, mas com um comando s para manipular valores de dígito único e um para lidar com valores de dois dígitos. Ou, se você tem o GNU sed (padrão em sistemas Linux), você pode fazer

sed -r '/<td>/ { N; s/(<td)(>\n[01]?[0-9]%)/ bgcolor="red"/; }' test.html

que usa a expressão regular estendida [01]?[0-9] para combinar um valor de dígito único ou um valor de dois dígitos menor que 20.

sed pode manipular não-inteiros (por exemplo, 17.5% ) valores com mais de dois dígitos (com zeros à esquerda) e números negativos. Se você edite sua pergunta para indicar quais formulários você precisa processar, Atualizarei esta seção.

awk programas, embora um pouco mais detalhados, são muito mais poderosos, como eles podem lembrar facilmente informações de uma linha para outra. Portanto, o script abaixo reconhece uma ampla variedade de formas numéricas:

awk -F% '
        last_was_td {
                  if ($1 < 20) print "<td bgcolor=\"red\">"
                  else print "<td>"
                }
                { last_was_td = 0 }
        /<td>/  {
                  last_was_td = 1
                  next
                }
                { print }
        ' test.html

Comece a ler no meio. Se uma linha contiver <td> , o programa define o sinalizador last_was_td e pula para a próxima linha de entrada. Caso contrário, o sinalizador é apagado e a linha é impressa. Agora, lendo o script a partir do topo: se a linha anterior foi um <td> , e o número (o primeiro campo, dividido pelo separador de campo % ) é menor que 20, nós imprimimos <td bgcolor="red"> ; caso contrário, imprimiremos <td> . (O valor em si é impresso pela declaração geral print no final.)

Todas as respostas acima escrevem o arquivo revisado na saída padrão. Como você sabe, você pode modificar o arquivo no local com sed -i . Com awk , grave a saída em um arquivo temporário e copie-o de volta no arquivo de entrada.

    
por 16.08.2018 / 05:34