AWK를 사용하여 HTML 파일의 여러 열 채우기

AWK를 사용하여 HTML 파일의 여러 열 채우기

AWK를 사용하여 이전 값을 기반으로 HTML 테이블(행/열)을 채우려고 합니다. 엑셀과 유사합니다.

예를 들어:

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로 다시 저장할 수 있습니다.

관련 정보