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パーサーを使用することをお勧めしますawkpythonbeautifulsoup基準寸法。

またはまたはより良い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として再保存できます。

関連情報