簡體   English   中英

awk中的gsub函數可為UNIX中的字符着色嗎?

[英]gsub function in awk for coloring characters in unix?

我有一個生成output.txt文件的腳本,在該腳本中有4列,如下所示。

Filename Date Space status
xyz.txt Nov18 3.8M  On_time
mnp.txt Nov11 8.7M  Delayed
pqr.csv Nov16 9.0M  No_records

我正在通過自動郵件發送輸出文件,我想給狀態字段添加顏色,例如(如果狀態為“延遲”,則分別為紅色,打開時間,綠色和無記錄,然后為黃色)。

首先,我將output.txt文件轉換為output.html,這很完美,並且我可以更改背景和文本顏色,但是無法更改Delay,On_time和n0_records的顏色。 請找到下面的代碼。

awk 'BEGIN { print "<html>"
print "<head>"
print "</head>"
print "<body bgcolor=\"#00ffff\" text=\"#0000FF\">"
print "<pre>"
}
{
gsub(/Fund name/,"<b>Fund name</b>")
gsub(/1234/,"<b>1234</b>")
print $0
}
END{ print "</pre>"
print "</body>"
print "</html>"
}
' ${PATH1}/output.txt > ${PATH1}/output.html
#  Send mail (uses SENDMAIL)
(
echo "From: Me <me@somewhere>"
echo "To: You <MPAYAL@StateStreet.com>"
echo "Cc: Someone Else <someoneo@somewhere>"
echo "Subject: Message Title"
echo "MIME-Version: 1.0"
echo "Content-Type: text/html"
echo "Content-Disposition: inline"
echo
echo "<pre>Any text here</pre>"
echo
cat ${PATH1}/output.html
echo
) | /usr/sbin/sendmail "$EMAILTO"

您能幫我這個忙嗎,我想我要留下一些gsub字段了。

awk 'BEGIN {
  print "<html>" \
    "<body bgcolor=\"#333\" text=\"#f3f3f3\">" \
    "<pre>"
}

NR == 1 { print $0 }

NR > 1 {
  if      ($NF == "Delayed")     color="red"
  else if ($NF == "On_time")     color="green"
  else if ($NF == "No_records")  color="yellow"
  else                           color="#f0f0f0"

  $NF="<span style=\"color:" color "\">" $NF "</span>"

  print $0
}

END {
  print "</pre>" \
    "</body>" \
    "</html>"
}
' output.txt > output.html

輸出量

 <html><body bgcolor="#333" text="#f3f3f3"><pre> Filename Date Space status xyz.txt Nov18 3.8M <span style="color:green">On_time</span> mnp.txt Nov11 8.7M <span style="color:red">Delayed</span> pqr.csv Nov16 9.0M <span style="color:yellow">No_records</span> </pre></body></html> 

因此,只要您對字段值進行操作,就不需要gsub AWK為第n 字段提供$n變量,其中n是一個正整數。 只需通過引用$n變量來比較字段值。

另外,在上述我已經使用了碼$NF 4列(字段的數量$NF等於4,特別是)。 第一行( NR == 1 )按原樣打印。 對於行(其余NR > 1 )時,代碼根據其值改變了 4列。

不是完整的重寫,而是您缺少的部分

$ awk 'BEGIN{color["On_time"]="green"; 
             color["Delayed"]="red"; 
             color["No_records"]="yellow"} 
 $4 in color{$4="<.. color=\""color[$4]"\">" $4 "</..>"}1' file

Filename Date Space status
xyz.txt Nov18 3.8M <.. color="green">On_time</..>
mnp.txt Nov11 8.7M <.. color="red">Delayed</..>
pqr.csv Nov16 9.0M <.. color="yellow">No_records</..>

這不是一個完整的答案,因此請不要接受,它只是對@RuslanOsmanov答案的建議改進,它基於@karakfa的建議,即使用哈希查找而不是一系列if-els來確定要使用的顏色(與@karakfa的建議,它顯示了如何在映射數組中包括默認值):

$ cat tst.awk
BEGIN {
    split("red green yellow",colors); colors[""] = "#f0f0f0"
    split("Delayed On_time No_records",t); for (i in t) cidx[t[i]]=i
}
{
    $NF = sprintf("<span style=\"color:%s\">%s</span>", colors[cidx[$NF]], $NF)
    print
}

$ awk -f tst.awk file
Filename Date Space <span style="color:#f0f0f0">status</span>
xyz.txt Nov18 3.8M <span style="color:green">On_time</span>
mnp.txt Nov11 8.7M <span style="color:red">Delayed</span>
pqr.csv Nov16 9.0M <span style="color:yellow">No_records</span>

如果輸入文件很大,這將提高腳本效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM