使用 AWK 填充 HTML 文件中的多列

使用 AWK 填充 HTML 文件中的多列

使用 AWK,我尝试根据先前的值填充 HTML 表(行/列)。类似于Excel。

例如:

table
user$ csv2html.awk table.csv


        rowing | fast | good
               | fast | good
        swim   |      | 
               |      | slow
               |      | increase
               | late | 
        golf   | red  | bad

我希望这个 html 表变成以下内容:

table
        rowing | fast | good
        rowing | fast | good
        swim   | fast | good
        swim   | fast | slow
        swim   | fast | increase
        swim   | late | increase
        golf   | red  | bad

该表可以有任意数量的列/行,并且值可以根据许多不同的单词而变化。我只是想了解如何解析 html,然后填写我在每列/行中找到的值。

输出必须是保持格式的新 html 文件。

更新:

<html><body><table>
<tr>
<th>Column1</th>
<th>Column2</th>
<th>Column3</th>
</tr>
<tr>
<td>rowing</td>
<td>fast</td>
<td>good</td>
</tr>
<tr>
<td></td>
<td>fast</td>
<td>good</td>
</tr>
<tr>
<td>swim</td>
<td></td>
<td></td>
</tr>
</table></body></html>

答案1

您需要在awk脚本中添加类似这样的内容:

for(i=1;i<=NF;i++){
    if($i==""){$i=last[i]}
    last[i]=$i
}

由于您不向我们展示您的脚本,因此您必须自己完成。

从结果表开始,它可能如下所示:

$ awk -F ' *\| *' '
    BEGIN{OFS="|"}
    {
      for(i=1;i<=NF;i++){
        if($i==""){$i=last[i]}
        last[i]=$i
      }$1=$1
    }1' table
rowing|fast|good
rowing|fast|good
swim|fast|good
swim|fast|slow
swim|fast|increase
swim|late|increase
golf|red|bad

然而!我想你用一个合适的 html 解析器而不是awk.我可以推荐pythonbeautifulsoup模块。

或者甚至更好,使用适当的数据分析工具,例如pandas,它通过其ffill方法:

ffill:将最后一个有效观察向前传播到下一个有效观察

#!/usr/bin/env python3
import pandas as pd
with open('file.html') as f:
    html = f.read()
    df = pd.read_html(html)[0]
    df = df.ffill()
    df.head()

输出:

   Column1 Column2 Column3
0  rowing    fast    good
1  rowing    fast    good
2    swim    fast    good

看这里

答案2

虽然 @pLumo 已经解决了这个问题,但出于某种原因,多字符正则FS表达式与我的版本gawk(5.1.0) 不能很好地配合,因此需要另一种方法来清理空白......

awk -F'\|' 'BEGIN{OFS="<\\td>\n<td>"; ORS="<\\td>\n<\\tr>\n"}
   {for (i=1; i<=NF; i++) {
      gsub(/^[ \t]+|[ \t]+$/, "", $i); $i=(!$i)?last[i]:$i; last[i]=$i
   } printf "<tr>\n<td>"}1' file

<tr>
<td>rowing<\td>
<td>fast<\td>
<td>good<\td>
<\tr>
<tr>
<td>rowing<\td>
<td>fast<\td>
<td>good<\td>
<\tr>
<tr>
<td>swim<\td>
<td>fast<\td>
<td>good<\td>
<\tr>
<tr>
<td>swim<\td>
<td>fast<\td>
<td>slow<\td>
<\tr>
<tr>
<td>swim<\td>
<td>fast<\td>
<td>increase<\td>
<\tr>
<tr>
<td>swim<\td>
<td>late<\td>
<td>increase<\td>
<\tr>
<tr>
<td>golf<\td>
<td>red<\td>
<td>bad<\td>
<\tr>

答案3

填充 CSV 然后生成 HTML 比先生成 HTML 然后填充 HTML 更简单、更稳健,但是......

$ awk -F'</?td>' 'NF>1{$0=($2=="" ? "<td>"prev"</td>" : $0); prev=$2} 1' file
<html><body><table>
<tr>
<th>Column1</th>
<th>Column2</th>
<th>Column3</th>
</tr>
<tr>
<td>rowing</td>
<td>fast</td>
<td>good</td>
</tr>
<tr>
<td>good</td>
<td>fast</td>
<td>good</td>
</tr>
<tr>
<td>swim</td>
<td>swim</td>
<td>swim</td>
</tr>
</table></body></html>

答案4

如果这是一项不需要编写脚本的一次性任务,您可以将 HTML 表格导入到某些电子表格程序(例如 LibreOffice Calc)中,使用其填充功能,然后将其保存回 HTML。

相关内容