【问题标题】:checking cell value in csv and formatting in HTML using awk使用 awk 检查 csv 中的单元格值和 HTML 格式
【发布时间】:2017-02-08 11:24:24
【问题描述】:
#!/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>"        
}  

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

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

输入.csv

USA,NO,45    
UK,YES,90*

【问题讨论】:

    标签: awk ksh


    【解决方案1】:

    我对@9​​87654321@中的原始逻辑进行了一些更改

    1. 在循环解析时从 $f 字段中删除空格
    2. 包括检查$f 到字符串NO

    我使用的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>"
    }
    

    产生的输出为

        <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>

    【讨论】:

      【解决方案2】:
      #!/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 输出的引用值调整双引号

      【讨论】:

        【解决方案3】:

        一些备注: 我想你想用gsub(/&amp;/, "\\&amp;amp;") 替换gsub(/&amp;/, "\\&amp;gt;")
        当您查看NR 时,您不需要header。 当您也想检查标题中的“否”时,您可以执行类似的操作

        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>"
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-04
          • 2013-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-02
          • 1970-01-01
          相关资源
          最近更新 更多