数値がしきい値より小さい場合の背景色の変更(html形式)

数値がしきい値より小さい場合の背景色の変更(html形式)

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>

20%未満の値を見つけて背景を赤に設定したいです。

<td bgcolor="red">

sedまたは他のツールを使用してください。例えば、

<td>
80%
</td>

変わらず維持されますが、

<td>
19%
</td>

傷が変わった

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

これまで試したスクリプトです。

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

ベストアンサー1

私はあなたの解決策を理解していると思います。シバプラタの答えsed一度実行変更する必要がある各データラインについて (コードで実行し、grep一度awkと追加を除くsed)。

  • awkそしてsedそれは非常に強力なコマンドです。一緒に使用したり、一緒に使用したりすることはほとんどありませんgrep
  • awk行番号を知っておいてください。grep -nを使用して行番号を生成してからを使用して処理する場合は、awkおそらく必要以上に多くのことをしています。
  • コマンドの実行に時間がかかります。ファイルの長さが100行の場合、SivaPrasathの回答にかかる時間に気付くことはありません。ファイルの長さが100万行の場合、SivaPrasathの回答はsed約125,000回実行されます。これは明らかかもしれませんが、必ずしも必要ではありません。

「値」が常に次の形式の場合NN%NN00は、との間の2桁の10進整数の場合は、次のコマンドを使用してすべての操作を実行19できます。sed

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

含まれている行を見ると、中かっこ<td>で囲まれたコマンドを実行します。ファイルから次の行(値を含む行)を読み取り、それをパターンスペースに追加します。次に、(パーセント)値が一致した場合(つまり)、(代替)置換を実行します。{}Ns<td><td bgcolor="red">[01][0-9]0019

値が単一の数値(たとえば、0through9ではなく00through 09)になる場合は、次のようにします。

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

同じロジックですが、s1 桁の値に対する 1 つのコマンドと 2 桁の値の 1 つのコマンドがあります。または、GNU(Linuxシステムの標準)がある場合は、sed次のことを実行できます。

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

拡張正規表現を使用して[01]?[0-9] 一致させます。誰でも20未満の1桁または2桁の数字。

sed整数以外の値(例17.5%:)、2桁以上の値(前にゼロが付く)、負の数を処理できます。もしあなたなら質問を編集してください作業する必要があるフォームを示すためにこのセクションを更新します。


awkプログラムは少し冗長ですが、ある行から別の行に情報を簡単に覚えることができるので、より強力です。したがって、次のスクリプトは複数の数値形式を認識できます。

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

途中から読み始めてください。行にが含まれている場合、<td>プログラムはlast_was_tdフラグを設定して次の入力行にジャンプします。それ以外の場合、フラグはクリアされ、対応する行が印刷されます。さて、上からスクリプトを読んでください。前の行がaで、<td>数字(%フィールド区切り文字で区切られた最初のフィールド)が20未満の場合は印刷し<td bgcolor="red">、それ以外の場合は印刷します<td>。 (値自体はprint通常のステートメントによって印刷されます。最後に。)


上記のすべての回答は、変更されたファイルを標準出力に書き込みます。ご存知のように、sed -i.を使用awkして出力を一時ファイルに書き込んでから入力ファイルにコピーすることもできます。

おすすめ記事