【问题标题】:Add HTML on every character line by line逐行在每个字符上添加 HTML
【发布时间】:2019-06-12 19:31:01
【问题描述】:

我有一个 CSV 文件,我逐行读取文件。

假设这条线是:

10h50 10 15 20 

我想得到的是:

<tr> <th scope="row">10h50</th> <td>10</td> <td>15</td> <td>20</td> </tr>

我开始了一些事情,但不确定这是否是最好的方法。 我有文件result.csv

 10h50,10,15,20
 10h51,11,15,22
 10h52,12,16,30

这个想法是:

cat result.csv | sed 's/,/ /g' > temp.csv

然后:

awk '{print $1}' temp.csv > time.csv
awk '{print $2}' temp.csv > col1.csv
awk '{print $3}' temp.csv > col2.csv
awk '{print $4}' temp.csv > col3.csv

开启time.csv

cat time.csv | sed 's/^/<tr> <th scope="row">/' | sed 's/$/<\/th> <\/tr>/' > new_time.csv
cat col1.csv | sed 's/^/<td>/' | sed 's/$/<\/td>' > new_col1.csv
cat col2.csv | sed 's/^/<td>/' | sed 's/$/<\/td>' > new_col2.csv
cat col3.csv | sed 's/^/<td>/' | sed 's/$/<\/td>' > new_col3.csv

然后:

paste new_date.csv new_col1.csv new_col2.csv new_col3.csv | column -s $'\t' -t > final_result.csv 

有什么建议吗?

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只会在发布者已经尝试自己解决问题时提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出以及您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • @AustenHolland 我确实更新并展示了到目前为止我尝试做的事情......请告知是否有更好的方法来做我正在寻找的事情。
  • @AustenHolland 我不需要任何代码...我只需要建议或指导...代码已经存在...但是有更好的方法吗?
  • pluse-uno 用于显示您的代码! ……但是……哎哟!!!您现在在下面有两个很好的答案,基本上向您展示了您的目标应该始终是读取数据一次,重新格式化并打印出来,而无需使用其他 shell 进程。如果您要继续这种工作,请通过Awk Tutorial 工作,您很快就会编写出高效且易于维护的代码。祝你好运。
  • 每次您使用awksedcat 等时,您都有系统启动程序的“费用”。编写一个程序来处理一个问题的首选方法。有时使用|(管道)将多个程序链接在一起更容易,这只是经验和评估其他权衡的问题。尝试解决一般问题(使用程序),然后用管道将它们链接在一起。对于您当前的情况,您只需要一个程序awk -f myawkScript inputFile &gt; outputFile。祝你好运!

标签: html bash csv


【解决方案1】:

awk:

#! /usr/bin/env awk -F, -f
BEGIN {f="<tr> <th scope="row">%s</th> <td>%d</td> <td>%d</td> <td>%d</td> </tr>\n"}
{printf f, $1, $2, $3, $4}

授予执行权限并调用类似

我的脚本文件.csv

【讨论】:

    【解决方案2】:

    如果您不介意循环/使用脚本,这很容易。

    输入 csv result.csv:

    10h50,10,15,20
    10h51,11,15,22
    10h52,12,16,30
    

    bash 脚本为:

    #!/bin/bash
    while IFS=, read -r col1 col2 col3 col4 || [ -n "$col1" ];
    do
        echo "<tr> <th scope=\"row\">$col1</ht> <td>$col2</td> <td>$col3</td> <td>$col4</td> </tr>"
    done < result.csv
    

    您将获得以下结果:

    <tr> <th scope="row">10h50</ht> <td>10</td> <td>15</td> <td>20</td> </tr>
    <tr> <th scope="row">10h51</ht> <td>11</td> <td>15</td> <td>22</td> </tr>
    <tr> <th scope="row">10h52</ht> <td>12</td> <td>16</td> <td>30</td> </tr>
    

    【讨论】:

    • 我明白了,就我而言,我有 21 列,所以我可以这样做:for i in {1..21} do awk '{print $("${i}"+2)}' result.csv &gt; col"${i}".csv done 其中 $3 将与 col1 匹配 ...?
    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2016-04-08
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多