使用awk检查csv中的单元格值和HTML格式

时间:2017-02-08 11:24:24

标签: awk ksh

#!/usr/bin/awk -f      
BEGIN {            
        FS=","          
        print "<table>"          
}               
 {        
        gsub(/</, "\\&lt;")        
        gsub(/>/, "\\&gt;")        
        gsub(/&/, "\\&gt;")        
        print "\t<tr>"        
        for(f = 1; f <= NF; f++)  {        
                if(NR == 1 && header) {        
                        printf "\t\t<th>%s</th>\n", $f        
                }         
                else printf "\t\t<td>%s</td>\n", $f        
        }               
        print "\t</tr>"        
}               

END {        
        print "</table>"        
}  

如果单元格值包含$f,那么如何检查循环内"No"的值,然后如何使用

进行打印
printf("<TD class=AltGreen  align=right height="17" width="5%">%s</TD>\n",$f)                     
instead of  printf "\t\t<td>%s</td>\n", $f  

Input.csv

USA,NO,45    
UK,YES,90*

3 个答案:

答案 0 :(得分:0)

我在Awk

中对原始逻辑进行了一些更改
  1. 在循环解析时从$f字段中删除空格
  2. 检查$f到字符串NO
  3. 我使用的Awk代码如下,

    #!/usr/bin/awk -f
    BEGIN {
            FS=","
            print "<table>"
    }
     {
            gsub(/</, "\\&lt;")
            gsub(/>/, "\\&gt;")
            gsub(/&/, "\\&gt;")
            print "\t<tr>"
    
            for(f = 1; f <= NF; f++)  {
    
                gsub(/ /, "", $f)
                if(NR == 1 && header) {
                    printf "\t\t<th>%s</th>\n", $f
                }
                else if ( $f == "NO" ) {
                    printf "\t\t<TD class=AltGreen  align=right height=\"17\" width=\"5%\">%s</TD>\n",$f
                }
                else printf "\t\t<td>%s</td>\n", $f
    
            }
            print "\t</tr>"
    }
    
    END {
            print "</table>"
    }
    

    生成输出

    &#13;
    &#13;
        <table>
                <tr>
                        <td>USA</td>
                        <TD class=AltGreen  align=right height="17" width="5%">NO</TD>
                        <td>45</td>
                </tr>
                <tr>
                        <td>UK</td>
                        <td>YES</td>
                        <td>90*</td>
                </tr>
        </table>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

#!/usr/bin/awk -f      
BEGIN {  
   #header = 1   
   # for the no in OP and NO in sample       
   IGNORECASE = 1

   FS=","          
   print "<table>"          
   }               
   {        
   gsub(/</, "\\&lt;")        
   gsub(/>/, "\\&gt;")        
   gsub(/&/, "\\&gt;")        
   print "\t<tr>"        
   for(f = 1; f <= NF; f++)  {        
      if(NR == 1 && header) {        
         printf "\t\t<th>%s</th>\n", $f        
         }         
         else {
            # your NO filtering
            if ( $f ~ /^NO$/) {
               printf("<TD class=AltGreen  align=right height=\"17\" width=\"5%\">%s</TD>\n", $f)
             else {
               printf "\t\t<td>%s</td>\n", $f
               }
            }
        }               
        print "\t</tr>"        
   }               

END {        
   print "</table>"        
   }  
  • 我只需修改一下你的代码就可以保持最新状态。
  • 使用$f ~ //
  • 我添加IGNORECASE,0表示区分大小写,1表示
  • 根据HTML输出的引用值调整双引号

答案 2 :(得分:0)

一些评论: 我想您要将gsub(/&/, "\\&gt;")替换为gsub(/&/, "\\&amp;") 当您检查header时,您不需要NR。 如果你想查看&#34; NO&#34;在标题中,您可以执行类似

的操作
echo "USA,NO,45
UK,YES,90*" | awk '
BEGIN {
   FS=","
   print "<table>"
 }
 {
    gsub(/</, "\\&lt;")
    gsub(/>/, "\\&gt;")
    gsub(/&/, "\\&amp;")
    print "\t<tr>"
    if(NR==1) {
        tag="th"
    } else {
       tag="td"
    }
    for (f = 1; f <= NF; f++)  {

        if ( $f =="NO") {
           printf("<%s class=AltGreen align=right height=\"17\" width=\"5%%\">%s</%s>\n",
               tag, $f, tag)   
        } else {
           printf "\t\t<%s>%s</%s>\n", tag, $f, tag
        }
     }
     print "\t</tr>"
  }