我编写了下面的 shell 脚本,用于将 csv 转换为 HTML,并为单个文件进行颜色编码,并且它工作正常。对于不同的报告(csv 文件),颜色编码的条件是不同的,因此我想让它动态化,而不是对条件进行硬编码。
这是我当前的一份报告代码:
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
在此代码中,我想在语句中使用awk
变量,但它不起作用。cond
if
这段代码正在运行:
if( $1=="180817CR0003988" ) {
color="BLUE"
}
但这不是:
if( cond ) {
color="BLUE"
}
我使用以下命令启动脚本:
/gk/laaz/csv2html.sh sample.csv sample.html "\$1==\"180817CR0003988\""
答案1
awk 变量被视为字符串。你甚至不能传递一个数组,更不用说一个条件了。但你不需要。不传递条件,只需传递运行所需的值:
if( $1 == cond ) {
color="BLUE"
}
然后,您可以使用以下命令启动脚本:
/gk/laaz/csv2html.sh sample.csv sample.html 180817CR0003988
答案2
不要使用变量。
awk 允许多个输入程序文件。
为每种情况生成一个临时 awk 文件,例如:
用于file1.csv
生成temporary.awk
程序(file1.awk)
function check() { if ( $1 == ""180817CR0003988" ) return "blue" ; else "back" }
为了fileX.csv
function check() { if ( $9 == ""unix.stackexchange.com" ) return "grey" ; else "blue" }
然后在通话中使用
color=check() ;
awk 被称为
awk -f temporary.awk -f long.awk ...
你的 awk 语句很大,我建议将它放在一个名为long.awk
.