Awk

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

  • September 10, 2021

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

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

見這裡

引用自:https://unix.stackexchange.com/questions/667421