我有一个大文件,其中包含超过 10000 条记录,格式如下。
这需要转换为 html 表格
我尝试了各种方法将其转换为 csv,然后转换为 html 等,但到目前为止我还没有得到想要的输出
Data.txt
Name : john
age : 20
tag id : 1234567
Name : Mark
age : 40
tag id : 832245
Name : tom
age : 60
tag id : 789324
......
我希望将其转换为这样的“html”表:
Name Age Tagid
John 20 1234567
Mark 40 832245
tom 60 789324
我需要处理 10000 条记录的文件。我该怎么做?
答案1
可以与 gawk 或 nawk 配合使用,但不能与 mawk 配合使用。
awk -F '[[:blank:]]*:[[:blank:]]*' '
BEGIN {print "<table><thead><tr><th>Name</th><th>Age</th><th>Tagid</th></tr></thead><tbody>"}
{
name = $2; getline
age = $2; getline
tagid = $2
print "<tr><td>" name "</td><td>" age "</td><td>" tagid "</td></tr>"
}
END {print "</tbody></table>"}
' Data.txt > Data.html
假设每条记录恰好有 3 行,顺序为名称、年龄、标签 ID
答案2
如果我知道如何在 sed 中进行多次搜索替换,那么这个会短得多。我不知道。哦,好吧。之后,它变得很愚蠢。不需要 awk。我假设您的数据文件名为 bs.dat,并且您想要一个 csv 以便稍后迁移到真正的数据库系统。输出到一个很棒的 html 文件......可能需要一些 css。这个糟糕的输出符合 html5 标准。(原样)
#!/bin/bash
touch me lel.html
rm me lel.html
touch me p1 p2 p3 p4 lel.html
#Fix BS data make a proper csv
c=","
#remove spaces
cat bs.dat | sed 's/ //g' > p1
#remove Name:
cat p1 | sed 's/Name://g' > p2
#Remove age:
cat p2 | sed 's/age://g' > p3
#remove tagid:
cat p3 | sed 's/tagid://g' > p4
#make a csv
file=p4
i=1
while read line
do
if [ "$i" = "1" ]; then
l1=$line$c && i=2
elif [ "$i" = "2" ]; then
l2=$l1$line$c && i=3
elif [ "$i" = "3" ]; then
l3=$l2$line >> me && i=1 && echo $l3 >> me
else
echo "something went wrong: $line"
exit
fi
done <"$file"
rm p1 p2 p3 p4
#Cool now we have a proper csv for later when we need to migrate to a real database
#ok lets make some html
touch lel.html
echo "<!DOCTYPE html><html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">" > lel.html
echo "<meta content=\"code, bash, lolz\" name=\"keywords\" /><title>IDK what</title></head><body>" >> lel.html
echo "<pre>Name Age ID " >> lel.html
while IFS=, read col1 col2 col3
do
echo "$col1 $col2 $col3" >> lel.html
done < me
echo "</pre></body></html>" >> lel.html
firefox lel.html
假设您有一个大型数据文件,您可以选择尽早删除 p1-p4 文件。csv 输出将是一个较小的文件,所有连续的输出也将如此,但它占用大量磁盘空间,我没有为效率和资源使用节省做出任何努力。
另外:姓名将被推到一起。等等,我没有在这些数据中看到 FirstName LastName。我假设它们确实存在,但为了简单起见被省略了……有一个简单的解决方法,使用 REGEX。在第一列值中有 [az][AZ] 的地方,插入一个空格