如何使用Shell脚本拆分和格式化数据输出?

马修

我正在尝试将YAML文件转换为HTML表,它涉及多个复杂条件,我知道可以使用Shell脚本来完成此操作,但是我在实现过程中遇到了一些问题,因此请向社区寻求帮助。

YAML内容格式如下。

- soft1:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft1_beta_ver:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft1_alpha_ver:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft2:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft2_beta_ver:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft2_alpha_ver:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip

< Omit more... >

它记录了多个软件的历史版本,我需要将其转换为HTML表代码并将其分别输出到文件中。

例如,输出soft1soft1_beta_versoft1_alpha_ver到同一文件(文件名使用soft1),将soft2输出到另一个文件。

需要转换的HTML表的格式如下。

<table>
    <thead>
        <tr>
            <th>type</th>
            <th>ver</th>
            <th>link</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>soft1</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft1</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft1</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
        <tr>
            <td>soft1_beta_ver</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft1_beta_ver</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft1_beta_ver</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
        <tr>
            <td>soft1_alpha_ver</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft1_alpha_ver</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft1_alpha_ver</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
    </tbody>
</table>

这是我正在尝试的shell脚本,我不知道如何将输出分成多个文件,以及如何获取软件类型的变量。

#!/usr/bin/env bash

cat  << EOF
<table>
    <thead>
        <tr>
            <th>type</th>
            <th>ver</th>
            <th>link</th>
        </tr>
    </thead>
    <tbody>
EOF

while IFS=": " read -r softver softlink
do
cat << EOF
        <tr>
            <td>$softver</td>
            <td></td>
            <td><a href="$softlink">download</a></td>
        </tr>
EOF
done

cat << EOF
    </tbody>
</table>
EOF

对此的任何帮助或建议都将非常有帮助,也将不胜感激。

埃德·莫顿

只需从原始输入文件生成所需的HTML:

$ cat ../tst.awk
/^-/ {
    sub(/:$/,"")
    out = type = $NF
    sub(/_.*/,"",out)
    close(out)
    if ( !seen[out]++ ) {
        prtBeg()
    }
    next
}
{
    sub(/:$/,"",$1)
    prtElt("<tr>")
    prtElt("<td>" type "</td>")
    prtElt("<td>" $1 "</td>")
    prtElt("<td>" $2 "</td>")
    prtElt("</tr>")
}
END {
    for (out in seen) {
        prtEnd()
    }
}

function prtElt(str) {
    depth[out] += gsub("<[^/<>]+>","&",str)
    printf "%*s%s\n", (depth[out]-1)*4, "", str >> out
    depth[out] -= gsub("</[^<>]+>","&",str)
}

function prtBeg() {
    prtElt("<table>")
    prtElt("<thead>")
    prtElt("<tr>")
    prtElt("<th>type</th>")
    prtElt("<th>ver</th>")
    prtElt("<th>link</th>")
    prtElt("</tr>")
    prtElt("</thead>")
    prtElt("<tbody>")
}

function prtEnd() {
    prtElt("</tbody>")
    prtElt("</table>")
}

$ ls
$
$ awk -f ../tst.awk ../file
$
$ ls
soft1  soft2

$ cat soft1
<table>
    <thead>
        <tr>
            <th>type</th>
            <th>ver</th>
            <th>link</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>soft1</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft1</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft1</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
        <tr>
            <td>soft1_beta_ver</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft1_beta_ver</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft1_beta_ver</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
        <tr>
            <td>soft1_alpha_ver</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft1_alpha_ver</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft1_alpha_ver</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
    </tbody>
</table>

$ cat soft2
<table>
    <thead>
        <tr>
            <th>type</th>
            <th>ver</th>
            <th>link</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>soft2</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft2</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft2</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
        <tr>
            <td>soft2_beta_ver</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft2_beta_ver</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft2_beta_ver</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
        <tr>
            <td>soft2_alpha_ver</td>
            <td>V1.0.1</td>
            <td>http://example.com/v1.0.1.zip</td>
        </tr>
        <tr>
            <td>soft2_alpha_ver</td>
            <td>V1.0.2</td>
            <td>http://example.com/v1.0.2.zip</td>
        </tr>
        <tr>
            <td>soft2_alpha_ver</td>
            <td>V1.0.3</td>
            <td>http://example.com/v1.0.3.zip</td>
        </tr>
    </tbody>
</table>

上面是针对此输入文件运行的:

$ cat ../file
- soft1:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft1_beta_ver:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft1_alpha_ver:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft2:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft2_beta_ver:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip
- soft2_alpha_ver:
    V1.0.1: http://example.com/v1.0.1.zip
    V1.0.2: http://example.com/v1.0.2.zip
    V1.0.3: http://example.com/v1.0.3.zip

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用shell脚本重新格式化csv文件中的数据

来自分类Dev

如何格式化shell命令的输出

来自分类Dev

如何格式化输入的数据并输出

来自分类Dev

如何使用 JavaScript 捕获和格式化表格数据?

来自分类Dev

如何捕获和格式化输出嵌套格式标签?

来自分类Dev

使用投影来格式化日期和获取本地时间的MongoDB Shell脚本

来自分类Dev

在bash脚本中使用printf格式化输出

来自分类Dev

如何使用cout格式化语句以正确的格式打印输入和输出?

来自分类Dev

如何在脚本中使用空格作为变量格式化日期输出?

来自分类Dev

处理和格式化数据帧的输出

来自分类Dev

如何格式化熊猫数据框的文件输出?

来自分类Dev

如何从脚本格式化I / O数据

来自分类Dev

使用php和mysql格式化输出

来自分类Dev

使用 printf 和 AWK 正确格式化我的输出

来自分类Dev

使用 setw 和 setfill 进行输出格式化

来自分类Dev

如何使用自定义boost :: log格式化程序输出TimeStamp和ThreadID属性?

来自分类Dev

如何使用printf和对话框格式化输出?

来自分类Dev

如何在分组拆分后的矩阵列表中重新整理,排列和格式化数据

来自分类Dev

如何使用emacs脚本重新格式化文件

来自分类Dev

获取从包含JSON数据的文件中读取的Shell脚本中的格式化数据

来自分类Dev

如何格式化和显示从AngularFire返回的Firestore数据?

来自分类Dev

Redux + Apollo:如何规范和格式化响应数据?

来自分类Dev

使用wss(websocket)格式化以发送和接收数据

来自分类Dev

使用年份和蛾的存在格式化数据javascript

来自分类Dev

diff两个目录用于更改和格式化输出以用于脚本

来自分类Dev

使用Shell脚本将文件输入格式化为所需的输出

来自分类Dev

R预测-如何格式化输出

来自分类Dev

如何格式化saveAsTextFile的输出?

来自分类Dev

如何格式化git diff的输出

Related 相关文章

  1. 1

    如何使用shell脚本重新格式化csv文件中的数据

  2. 2

    如何格式化shell命令的输出

  3. 3

    如何格式化输入的数据并输出

  4. 4

    如何使用 JavaScript 捕获和格式化表格数据?

  5. 5

    如何捕获和格式化输出嵌套格式标签?

  6. 6

    使用投影来格式化日期和获取本地时间的MongoDB Shell脚本

  7. 7

    在bash脚本中使用printf格式化输出

  8. 8

    如何使用cout格式化语句以正确的格式打印输入和输出?

  9. 9

    如何在脚本中使用空格作为变量格式化日期输出?

  10. 10

    处理和格式化数据帧的输出

  11. 11

    如何格式化熊猫数据框的文件输出?

  12. 12

    如何从脚本格式化I / O数据

  13. 13

    使用php和mysql格式化输出

  14. 14

    使用 printf 和 AWK 正确格式化我的输出

  15. 15

    使用 setw 和 setfill 进行输出格式化

  16. 16

    如何使用自定义boost :: log格式化程序输出TimeStamp和ThreadID属性?

  17. 17

    如何使用printf和对话框格式化输出?

  18. 18

    如何在分组拆分后的矩阵列表中重新整理,排列和格式化数据

  19. 19

    如何使用emacs脚本重新格式化文件

  20. 20

    获取从包含JSON数据的文件中读取的Shell脚本中的格式化数据

  21. 21

    如何格式化和显示从AngularFire返回的Firestore数据?

  22. 22

    Redux + Apollo:如何规范和格式化响应数据?

  23. 23

    使用wss(websocket)格式化以发送和接收数据

  24. 24

    使用年份和蛾的存在格式化数据javascript

  25. 25

    diff两个目录用于更改和格式化输出以用于脚本

  26. 26

    使用Shell脚本将文件输入格式化为所需的输出

  27. 27

    R预测-如何格式化输出

  28. 28

    如何格式化saveAsTextFile的输出?

  29. 29

    如何格式化git diff的输出

热门标签

归档