带有动态颜色编码的 CSV 到 html

带有动态颜色编码的 CSV 到 html

我编写了下面的 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变量,但它不起作用。condif

这段代码正在运行:

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.

相关内容