提取标签 之间的数据

2024-01-18

我有如下数据 如何打印两个标签之间的数据 我希望数据是命令分隔的 csv 格式

我的方法是将数据转换为水平格式,然后在每第四列后进行剪切并转换为垂直格式

xml文件中的数据

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-
<sst uniqueCount="12" count="12"
    xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
-
    <si>
        <t>"NAME"</t>
    </si>
-
    <si>
        <t>"Vikas"</t>
    </si>
-
    <si>
        <t>"Vijay"</t>
    </si>
-
    <si>
        <t>"Vilas"</t>
    </si>
-
    <si>
        <t>"AGE"</t>
    </si>
-
    <si>
        <t>"24"</t>
    </si>
-
    <si>
        <t>"34"</t>
    </si>
-
    <si>
        <t>"35"</t>
    </si>
-
    <si>
        <t>"COURSE"</t>
    </si>
-
    <si>
        <t>"MCA"</t>
    </si>
-
    <si>
        <t>"MMS"</t>
    </si>
-
    <si>
        <t>"MBA"</t>
    </si>
</sst>
      

我已经尝试过下面的命令不起作用..

awk '/<t/{flag=1;next}/<t/{flag=0}flag' abc.xml

即使尝试了下面的命令,它也给出了数据,但在单行中

awk -F'(</*t>|</*t>)' 'NF>1{for(i=2;i<NF; i=i+2) printf("%s%s", $i, (i+1==NF)?ORS:OFS)}' OFS=',' demo.xml

我想要以下数据作为输出

NAME,AGE,Course
Vikas,"25",MCA
Prabhash,"34",MBA
Arjun,"21",MMS

仅使用您显示的示例,您可以尝试以下操作。

awk -v OFS="," '
!NF || /^-$/{ next }
/<t>"COURSE"<\/t>/{
  foundAge=foundName=""
  foundCourse=1
  count=0
}
/<t>"AGE"<\/t>/{
  foundAge=1
  foundName=""
  count=0
}
/<t>"NAME"<\/t>/{
  foundName=1
  count=0
}
foundAge && match($0,/>[^<]*/){
  age[++count]=substr($0,RSTART+1,RLENGTH-1)
}
foundName && match($0,/>[^<]*/){
  name[++count]=substr($0,RSTART+1,RLENGTH-1)
}
foundCourse && match($0,/>[^<]*/){
  course[++count]=substr($0,RSTART+1,RLENGTH-1)
}
END{
  for(k=1;k<=count;k++){
    if(name[k]){
      print name[k],age[k],course[k]
    }
  }
}
'  Input_file

解释:对上述内容添加详细解释。

awk -v OFS="," '                                 ##Starting awk program from here.
!NF || /^-$/{ next }                             ##if line is empty or starts with - then skip that line.
/<t>"COURSE"<\/t>/{                              ##Checking if line has <t>"COURSE"</t> then do following.
  foundAge=foundName=""                          ##Nullifying foundAge and foundName here.
  foundCourse=1                                  ##Setting foundCourse to 1 here.
  count=0                                        ##Setting count to 0 here.
}
/<t>"AGE"<\/t>/{                                 ##Checking if line has <t>"AGE"</t> then do following.
  foundAge=1                                     ##Setting foundAge to 1 here.
  foundName=foundCourse=""                       ##Nullifying foundName and foundCourse here.
  count=0                                        ##Setting count to 0 here.
}
/<t>"NAME"<\/t>/{                                ##Checking if line has <t>"NAME"</t> then do following.
  foundName=1                                    ##Setting foundName to 1 here.
  count=0                                        ##Setting count to 0 here.
}
foundAge && match($0,/>[^<]*/){                  ##Checking if foundAge is set and using match function to get values from > to till < here.
  age[++count]=substr($0,RSTART+1,RLENGTH-1)     ##Creating age with index of count and having matched regex value here.
}
foundName && match($0,/>[^<]*/){                 ##Checking if foundName is set and using match function to get values from > to till < here.
  name[++count]=substr($0,RSTART+1,RLENGTH-1)    ##Creating name with index of count and having matched regex value here.
}
foundCourse && match($0,/>[^<]*/){               ##Checking if foundCourse is set and using match function to get values from > to till < here.
  course[++count]=substr($0,RSTART+1,RLENGTH-1)  ##Creating course with index of count and having matched regex value here.
}
END{                                             ##Starting END block of this awk program from here.
  for(k=1;k<=count;k++){                         ##Traversing through all elements of name here.
    if(name[k]){
      print name[k],age[k],course[k]             ##Printing respective array values here.
    }
  }
}
'  Input_file                                    ##Mentioning Input_file name here.


EDIT:根据OP的评论,如果一行中需要所有值,请尝试以下操作:

awk -v OFS="," '
!NF || /^-$/{ next }
/<t>"COURSE"<\/t>/{
  foundAge=foundName=""
  foundCourse=1
  count=0
}
/<t>"AGE"<\/t>/{
  foundAge=1
  foundName=""
  count=0
}
/<t>"NAME"<\/t>/{
  foundName=1
  count=0
}
foundAge && match($0,/>[^<]*/){
  age[++count]=substr($0,RSTART+1,RLENGTH-1)
}
foundName && match($0,/>[^<]*/){
  name[++count]=substr($0,RSTART+1,RLENGTH-1)
}
foundCourse && match($0,/>[^<]*/){
  course[++count]=substr($0,RSTART+1,RLENGTH-1)
}
END{
  for(k=1;k<=count;k++){
     if(name[k]){
     nameVal=(nameVal?nameVal OFS:"")name[k]
     ageVal=(ageVal?ageVal OFS:"")age[k]
     courseVal=(courseVal?courseVal OFS:"")course[k]
     }
  }
  print nameVal,ageVal,courseVal
}
'  Input_file
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提取标签 之间的数据 的相关文章

  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 在 Fish Shell 中设置导出

    我安装了多个版本的 PHP 对于我的正常开发 我总是使用通过自制程序安装的 PHP 5 5 x 在鱼壳里 which php php version gt usr local bin php gt PHP 5 5 8 cli built J
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • 如何将设备屏幕位置转换为发送事件位置?

    我知道关于input tap x yshell 命令 但是 我想了解如何 使用执行单击sendevent命令 我能够通过以下命令实现它 sendevent dev input event5 3 53 X sendevent dev inpu
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 为什么总是./configure;制作;进行安装;作为 3 个单独的步骤?

    每次从源代码编译某些内容时 都会经历相同的 3 个步骤 configure make make install 我明白 将安装过程分为不同的步骤是有意义的 但我不明白 为什么这个星球上的每个编码员都必须一次又一次地编写相同的三个命令才能完成
  • 了解多个进程的并发文件写入

    从这里 UNIX 中文件追加是原子的吗 https stackoverflow com questions 1154446 is file append atomic in unix 考虑多个进程打开同一个文件并向其追加内容的情况 O AP
  • ReferenceError:MongoDB shell 中未定义 require

    我尝试通过 Windows 命令 Windows 8 1 从 Mongo 客户端连接 MongoDB 当我使用require 在 javascript 中 我遇到如下错误 有人有同样的问题吗 我有错过任何一个吗require有关的npm安装
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • UNIX系统调用监视器

    如何监控进程的系统调用 Check strace http linux die net man 1 strace 在最简单的情况下 strace 运行指定的命令直到退出 它拦截并记录进程调用的系统调用以及进程接收的信号 每个系统调用的名称
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • 如何在shell中输出返回码?

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

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt
  • 使用 awk 读取文件并搜索另一个文件

    我正在读取一个文件 每行都有数字 我需要搜索另一个满足这些数字和其他条件的文件 我正在尝试使用 awk 来做到这一点 但遇到了问题 File a txt 1476 1477 1497 现在我需要打印第 12 列包含这些数字的行以及第 3 列
  • 针对库编译时出现“未定义引用”错误

    我在代码中添加了第三方库 但在运行时遇到这样的错误make 请帮助我理解这个错误 text 0x9b4 undefined reference to snd strerror home bet Tent tun app Common hl

随机推荐

  • 如何在Client中获取socket.io客户端的session id

    我想在我的 socket io 客户端中获取客户端的会话 ID 这是我的 socket io 客户端 var socket new io Socket config host port config port rememberTranspo
  • Google App Engine app.yaml 中的反向skip_files

    我目前有以下内容skip files在我的 app yaml 中 skip files json yaml Gruntfile js bower components node modules src tests tmp 这实在是太臃肿了
  • Ruby 中的“<<-”是什么意思?

    例如 code lt lt EOH bundle install bundle exec unicorn c etc unicorn cfg D EOH 这段代码有什么作用 什么是 lt lt called 它被称为定界符 定义多行字符串的
  • 在 CATextLayer 中显示属性字符串

    我有一个简单的示例应用程序 我在其中创建了一个CATextLayer并设置其string财产给NSAttributedString 然后我将该 CATextLayer 添加到视图中 import
  • 给定一个整数数组,找到第一个唯一的整数

    给定一个整数数组 找到第一个唯一的整数 我的解决方案 使用std map 将整数 数字作为键 其索引作为值 一一放入其中 O n 2 lgn 如果有重复 则从地图中删除该条目 O lg n 将所有数字放入映射后 迭代映射并找到索引最小 O
  • 如何覆盖视频的 i 帧?

    我想销毁视频的所有 i 帧 这样做我想检查仅加密视频的 i 帧是否足以使其无法观看 我怎样才能做到这一点 仅删除它们并重新压缩视频与真正覆盖流中的 i 帧而不重新计算 b 帧等不同 使用 libavformat 来自 ffmpeg 的库 您
  • 如何在多线程环境中使用旧的单线程 C++ 库

    我有一个旧的 C 库 它是为在单线程环境中使用而设计的 该库公开了用于初始化的接口 这改变了库的内部数据结构 以及仅读取数据和进行计算的用法 我的目标是在 Windows 多线程应用程序中使用这个库 不同的线程调用使用不同数据初始化的 dl
  • 如何确保python脚本使用虚拟环境?

    我创建了虚拟环境并激活它 已安装软件包但无法从虚拟环境导入它们 pip freeze 但尝试导入模块时出错 Traceback most recent call last File z Documents Python Projects P
  • 比较 std::wstring 和 std::string

    我怎样才能比较wstring 例如L Hello to a string 如果我需要相同的类型 如何将它们转换为相同的类型 既然你问了 这是我从字符串到宽字符串的标准转换函数 使用 C 实现std string and std wstrin
  • 通过jenkins上传.ipa到testflight

    我正在使用詹金斯进行自动构建和自动部署 到目前为止 我成功地实现了构建生成 即 ipa 文件 我还实现了diawi链接生成 现在我想通过 jenkins 将 ipa 上传到 testflight 现在我正在使用这个脚本进行上传 ipa di
  • IE7 无法识别文本输入只读属性?

    我通过 javascript 设置 readonly readonly 换句话说 true document getElementById my id setAttribute readonly readonly 这在 FF Safari
  • 插入到数组中不存在的索引处

    我正在尝试使用从数据库中提取的数据来格式化 JavaScript 中的数组 以便行的 ID 是数组的索引 因此数据 ID Data 1 hi 2 more data 4 junk data 8 hello world 12 h3ll0 看起
  • 使用指针的字符串长度

    我正在寻找一些代码技巧 我发现一个我了解了基础知识但我不明白它为什么存在的原因 它与 while 循环中的字符串指针有关 通常我不处理字符串 因为我主要在嵌入式系统 小工具上工作 我需要理解为什么字符串指针在不增加时会结束 因此 在这段代码
  • 在 Python 中使用 OpenCV VideoCapture 获取当前帧

    我正在使用 cv2 VideoCapture 在 python 脚本中读取 RTSP 视频链接的帧 read 函数位于每秒运行一次的 while 循环中 但是 我没有从流中获取最新的帧 我使用较旧的帧 这样我的延迟就增加了 无论如何 我是否
  • 创建一个真正的无头 QApplication 实例

    我有一个 Qt 5 8 通过 PyQt5 应用程序 其许多测试需要实时QApplication实例以测试 gui 小部件交互 然而 在我的新 Mac OS X 10 11 6 机器上 运行这些测试时 窗口不断被创建和销毁 导致整个系统的 U
  • 使用 Google 新闻 RSS URL 时如何指定检索本地新闻?

    我正在尝试构建一个使用 Google News RSS 的 RSS 解析器 我只需定位以下 URL 即可从新闻 URL 检索新闻文章 https news google com news section output rss 但是 在谷歌新
  • Flutter无法显示视频

    import package video player video player dart import package flutter material dart void main gt runApp VideoApp class Vi
  • php/Codeigniter--如何通过排除时间来比较仅日期

    我的数据库表中有一个字段为creater date作为日期时间并以以下形式存储值2013 09 13 02 12 44 现在我必须将今天的日期 没有时间 与creater date表字段 我尝试了下面的代码 但它显示错误 function
  • 错误:与元素类型“uses-sdk”关联的属性“tools:overrideLibrary”的前缀“tools”未绑定

    在 mac osx Sierra 上从 unity 构建 apk 文件时出现以下错误 在我重新启动我的 MacBook 之前 这也可以正常工作 但现在不行 我在下面添加了错误详细信息 注意 我正在使用 facebook sdk Error
  • 提取标签 之间的数据

    我有如下数据 如何打印两个标签之间的数据 我希望数据是命令分隔的 csv 格式 我的方法是将数据转换为水平格式 然后在每第四列后进行剪切并转换为垂直格式 xml文件中的数据