awk中的元编程,将文件转换为html表格格式

2023-12-14

我有以下文件:

table.txt(逗号分隔)

1,Example Title
COL1,COL2,COL3,COL4,COL5
BRCC,ACGC,15869,105A,1
BCAS,GAAG,73345,369T,2

模板.awk

function parse_print(s){
    s = gensub(/^\s+|\s+$/,"","g",s)
    s = gensub(/[\42]/,"\\\\\042","g",s)
    s = gensub(/\$[0-9]+/,"\" & \"","g",s)
    s = gensub(/\$e/,"\" & \"","g",s)
    return s;
}

/^[^%]/{print "print \"" parse_print($0) "\""; next}
/^%BEGIN$|^%END$/{print substr($1,2) "{"; next}
/^%END.+$/{print "}"; next}
{print substr($1,2) "{"}
{
    if($2 == "%FOREACH"){
        pprint = gensub(/(\S+\s+){2}(.*)/,"\\2","g")
        print "for(e=1; e<=NF; ++e) print \"" parse_print(pprint) "\""
    }else{
        pprint = gensub(/\S+\s+(.*)/,"\\1","g")
        print "print \"" parse_print(pprint) "\""
    }
}
{print "}"}

表.tawk

%BEGIN
                    <style>
                        .my_table {border-bottom:3px double black; border-collapse: collapse; }
                        .my_table tr.header{border-bottom:3px double black;}
                        .my_table td{text-align: center;}
                    </style>
                    <table class="my_table">
%ENDBEGIN
%NR==1              <caption>Table $1. $2</caption>
%NR==2              <tr class="header">
%NR>2               <tr>
%NR==2  %FOREACH    <th>$e</th>
%NR>2   %FOREACH    <td>$e</td>
%NR!=1              </tr>
%END
                    </table>
%ENDEND

元编程.sh

#!/bin/sh
# metaprogram
awk '@include "template"' $1 > .table.awk
awk -vFS="," -f .table.awk $2
rm .table.awk

这个想法是使用元编程来分离演示的逻辑,这基于 @kent 的评论如何使用awk的问题格式化html中的文本用于将文本文件转换为 html 表格格式。

./metaprogramming.sh table.tawk table.txt > table.html

这得到,

<style>
.my_table {border-bottom:3px double black; border-collapse: collapse; }
.my_table tr.header{border-bottom:3px double black;}
.my_table td{text-align: center;}
</style>
<table class="my_table">
<caption>Table 1. Example Title</caption>
<tr class="header">
<th>COL1</th>
<th>COL2</th>
<th>COL3</th>
<th>COL4</th>
<th>COL5</th>
</tr>
<tr>
<td>BRCC</td>
<td>ACGC</td>
<td>15869</td>
<td>105A</td>
<td>1</td>
</tr>
<tr>
<td>BCAS</td>
<td>GAAG</td>
<td>73345</td>
<td>369T</td>
<td>2</td>
</tr>
</table>

问题1

有没有办法在不创建临时文件的情况下进行调用.table.awk,甚至,无需使用bash脚本 (awk直接打电话)?

问题奖金

有没有办法做得更好?那里有图书馆吗awk已经这样做了?


TXR 是一个工具,它提供了一种用于基于模板的数据提取和格式化的语言,并结合了原始的 Lisp 方言:

In format.txr我们有:

@num,@title
@(coll)@{heading /[^,]+/}@(end)
@(collect)
@  (coll)@{data /[^,]+/}@(end)
@(end)
@(output :filter :tohtml)
<style>
.my_table {border-bottom:3px double black; border-collapse: collapse; }
.my_table tr.header{border-bottom:3px double black;}
.my_table td{text-align: center;}
</style>
<table class="my_table">
<caption>Table @num. @title</caption>
<tr class="header">
@  (repeat)
<th>@heading</th>
@  (end)
</tr>
@  (repeat)
<tr>
@    (repeat)
<td>@data</td>
@    (end)
</tr>
@  (end)
</table>
@(end)

我们将其应用到data像这样的文件:

$ txr format.txr data 
<style>
.my_table {border-bottom:3px double black; border-collapse: collapse; }
.my_table tr.header{border-bottom:3px double black;}
.my_table td{text-align: center;}
</style>
<table class="my_table">
<caption>Table 1. Example Title</caption>
<tr class="header">
<th>COL1</th>
<th>COL2</th>
<th>COL3</th>
<th>COL4</th>
<th>COL5</th>
</tr>
<tr>
<td>BRCC</td>
<td>ACGC</td>
<td>15869</td>
<td>105A</td>
<td>1</td>
</tr>
<tr>
<td>BCAS</td>
<td>GAAG</td>
<td>73345</td>
<td>369T</td>
<td>2</td>
</tr>
</table>

请注意,:filter :tohtml处理 HTML 的转义字符;如果数据包含&例如,我们得到&amp;等等。

垂直的collect和水平的coll指令隐式地将匹配的模式变量支持到嵌套列表中;repeat隐式解开列表,这样就只有简单的变量引用,例如@data出现在输入匹配部分和输出中。

这是 Vim 下语法高亮的样子,非常清楚什么是模板材料,什么是 TXR 语法:

Screenshot of code with syntax coloring

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

awk中的元编程,将文件转换为html表格格式 的相关文章

  • 如何使用 bash 显示具有两个子文件夹的文件夹?

    我通过 Cygwin 使用 bash 我有一个大文件夹 a 有很多子文件夹 b 这些子文件夹各有一个或两个子文件夹 c 我想找到所有有两个子文件夹 c 的子文件夹 b 并输出它们 结构如下 a b1 c1 b2 c1 c2 b3 c1 c2
  • 如何在 sed 中转义方括号[重复]

    这个问题在这里已经有答案了 我正在使用 grep 和 sed 解析遗留的 C 代码 当尝试替换方括号时 发生了一些奇怪的事情 以下代码替换方括号效果很好 echo xyx xzx xyx sed s g 结果是 xyx xzx xyx 当我
  • 使用正确的头打印文件名

    我想获取当前目录中的文件名 使得文件的第一行等于myWord 我想结合find type f命令与 exec选项与head 1 filename但无济于事 有没有一些聪明的 单行的解决方案来解决这个问题 您可以使用find with awk
  • 在bash中,是否有相当于“错误消息”的东西

    在 perl 中 您可以使用错误消息退出die some msg bash 中是否有等效的单个命令 现在 我正在使用命令来实现这一点 echo some msg exit 1 你可以很容易地自己推出 die echo 1 gt 2 exit
  • 使用带有curl 的内部字段分隔符

    当我做 ls IFS l 我得到了我期望的输出 当我做 curl IFShttp www google com 我不 我是否误解了内部字段分隔符 如何在不使用任何空格字符的情况下运行curl 命令 您需要将变量放在大括号内 否则 shell
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • 迭代 bash 脚本中的变量名称

    我需要在一堆文件上运行一个脚本 这些文件的路径被分配给train1 train2 train20 我想 为什么不使用 bash 脚本使其自动执行呢 所以我做了类似的事情 train1 path to first file train2 pa
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • jq:将对象数组转换为对象

    我收到了来自curl的回复 格式如下 list value 1 id 12 value 15 id 13 value 4 id 14 给定 id 之间的映射 如下所示 12 newId1 13 newId2 14 newId3 我想做这个
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 动态参数值取决于另一个动态参数值

    启动前提 非常严格的环境 Windows 7 SP1 Powershell 3 0 使用外部库的可能性有限或不可能 我正在尝试重写之前创建的 bash 工具 这次使用 PowerShell 在 bash 中 我实现了自动完成功能 以使该工具
  • 动态向类添加类方法

    我有以下片段 FEED TYPES fan mail Fan Mail review Review tip Tip fan user Fan User fan song Fan Song fan album Fan Album played
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 如何从 bash 数组中删除元素而不展平数组

    我想创建一个采用 bash 数组的函数 如下所示 a element zero element one element two 并删除一个元素 如 元素一 并留下一个数组 如下所示 a element zero element two 这样
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 使用 awk 读取文件并搜索另一个文件

    我正在读取一个文件 每行都有数字 我需要搜索另一个满足这些数字和其他条件的文件 我正在尝试使用 awk 来做到这一点 但遇到了问题 File a txt 1476 1477 1497 现在我需要打印第 12 列包含这些数字的行以及第 3 列
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 为什么 $((true == false)) 在 bash 中计算结果为 1?

    为什么 bash 有以下行为 echo true false 1 我本以为这会打印0 但它打印1 以下事实使情况变得更加复杂 gt echo true 0 gt echo false 0 gt echo true true 1 gt ech

随机推荐

  • 使用javascript 下载base64 数据| IE11 [重复]

    这个问题在这里已经有答案了 我正在尝试使用 JavaScript 中的 window location href 下载 base64 数据 它在 Chrome 中工作正常 但相同的代码在 IE11 中不起作用 您能否让我知道解决方法或解决方
  • 连接单元格

    我有两个细胞 A 100x2 double 80x2 double 50x2 double B 100x5 double 80x5 double 50x5 double 我怎样才能将它们连接起来以获得类似的东西C cat 2 A B 对于每
  • 将编辑文本字段中的文本添加到电子邮件中

    我有一个应用程序 希望与我们联系 以便用户输入姓名 地址 电话号码和评论部分 然后他们将单击 撰写邮件 按钮 它将自动将文本加载到电子邮件中 已经解决了一些代码 但不确定如何将编辑文本中的文本放入我的电子邮件消息中 任何人对我如何做到这一点
  • 为什么 unittest.mock.ANY 不能与 Django 对象正常工作?

    我在 Django 中编写了一个测试 并且我using unittest mock ANY忽略字典中的某些值 这是测试 from django test import TestCase from django contrib auth im
  • 快速轴对齐单元格遍历算法

    给定一个轴对齐的正方形 分为四个大小相等的单元格 A B C 和 D 给定一条从点 s1 到点 s2 的线段 查找该段 如果有 遍历的单元格 按遍历顺序排序 的最快方法是什么 在上面的例子中 正确的结果是 第 1 段 D 分段 2 A B
  • 实体框架 EDMX - 实体复数修复

    我们发现复数化服务对某些单词存在一些错误 例如它认为 Campus 是复数 并用 Campu 将其单数化 无论如何 我们已经弄清楚如何使用 ICustomPluralizationMapping 接口向服务添加自定义映射 问题是 我们如何告
  • JavaFX 创建弹出窗口,无需外部库

    我怎样才能创建像这样的弹出窗口DatePicker班级来自javafx scene control DatePicker如这里所示 显示时 弹出窗口应位于所有其他组件的顶部 如此处所示 弹出窗口位于TextField 找到了一个非常简单的解
  • 关于异步返回类型

    想知道为什么我们应该指定这一点async方法确实返回任务对象 指定它似乎是多余的async关键字加上它很混乱 因为你并没有真正创建Task object 据我了解 编译器确实发出了创建任务对象所需的代码 无论是在等待调用还是用新任务包装返回
  • Rails 3:如何从 js.erb 文件调用 javascript 函数

    现在我已经升级到 Rails 3 我正在尝试找出分离和重用 javascript 片段的正确方法 这是我正在处理的场景 我有一个包含两个区域的页面 一个区域包含可拖动的元素 另一个区域包含可放置的元素 当页面加载时 我使用 jQuery 来
  • 单例模式的问题

    过去几天我一直在阅读有关单例模式的内容 人们普遍认为 需要它的场景很少 如果不是罕见的话 可能是因为它有自己的一系列问题 例如 在垃圾收集环境中 这可能是内存管理方面的问题 在多线程环境中 它可能会导致瓶颈并引入同步问题 从测试的角度来看令
  • 是否可以在 Java 运行时设置环境变量?

    是否可以在 Java 运行时设置环境变量 应用 在Java 1 5 java lang System 类中有 getenv 方法 我会 只需要一个 setenv 方法 是否可以修改java进程本身的环境变量 不在子进程中 通过JNI可以实现
  • android 检查数据库中是否存在记录

    我想检查 SQLite 数据库中是否存在记录 这是我到目前为止所做的 当我搜索已经存在的记录时 我从列表中的 EditText 获取值 code from activity class public View OnClickListener
  • 构建 DOM 中任何给定节点的 querySelector 字符串值

    我正在尝试找到一种方法来构建任何给定节点的 querySelector 字符串 换句话说 选择页面上的任何节点 是否可以遍历 DOM 并构建一个字符串 允许我将生成的字符串传递给 document querySelector 并取回我选择的
  • “class boost::asio::async_result”中没有名为“completion_handler_type”的类型

    我正在尝试编写一个可以使用 boost spawn 调用的堆栈协程 协程内部启动一个线程 等待线程结束 并获取线程生成的一个整数值作为协程的返回值 但是 我遇到了一个错误 有专家可以帮我看一下吗 我的环境是 Ubuntu22 04 GCC9
  • 按日期获取维基百科修订 ID 的 API [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何API可以按日期获取维基百科修订ID 而不是检查所有修订历史记录并提取该日期之前的最新修订 谢谢你 The 修订查询 API允许您传递时间
  • 将带有 html 的字符串保存为图像

    我有一个包含网页中整个 html 的字符串 我想将此字符串保存为具有所有 html 规则的图像 最后有来自网页的图像 我该如何用c 和asp net解决这个问题 您可以使用以下组件将 HTML 文件转换为 PDF http code goo
  • Cython:创建数组抛出“常量表达式中不允许”

    我尝试将一个复杂的函数从 Python 重写为 Cython 以大幅加快速度 但遇到以下问题 在使用 hh vers vector pyx 编译函数时 setup ext modules cythonize hh vers vector p
  • Pushl %esp 是在存储之前还是之后更新 ESP?

    The pushlY86 指令将堆栈指针减 4 并将寄存器值写入内存 所以并不清楚处理器执行指令时应该做什么pushl esp 因为被压入的寄存器正在被同一指令更改 可能发生两种可能的事件 1 推入原值 esp 或 2 压入递减的值 esp
  • 使用 Mat OpenCV 访问像素

    我想使用 OpenCV 2 3 访问 RGB 像素 我正在尝试这样 但就像每个像素在帧后都是相等的 因为我没有输出 图像来自我的网络摄像头 我可以看到它们 顺便说一句 红色 0 THX Mat frame Mat oldFrame Vide
  • awk中的元编程,将文件转换为html表格格式

    我有以下文件 table txt 逗号分隔 1 Example Title COL1 COL2 COL3 COL4 COL5 BRCC ACGC 15869 105A 1 BCAS GAAG 73345 369T 2 模板 awk func