提取标签 之间的数据

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(使用前将#替换为@)

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

  • python等待shell命令完成

    我正在运行脚本来解压缩一些文件 然后删除 rar 文件 我通过 shell 运行命令来完成此操作 我尝试了几种不同的方法来让脚本等待文件解压完成 但它仍然继续并在文件使用完成之前删除文件 我已经尝试过下面的代码 这是行不通的 我试图看看是否
  • 有哪些基于对象的 shell?

    我打算写一个面向对象的shell 基于Python 我已经有很多想法了 但在实现它之前 我想通过一些现有的 shell 来激发我的灵感 我所说的面向对象的基本意思是 参数不仅仅是字符串数组 而且是对象数组 返回值也是一个对象 不仅有 std
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • VBA Shell 并等待退出代码

    我正在打包一个办公应用程序 VBA 它调用 C 控制台应用程序来执行应用程序 大型模拟程序 的一些繁重工作 我希望能够让 VBA 应用程序等待控制台应用程序完成并从控制台应用程序检索退出代码 我已经能够做到前者 但尚未能够从应用程序中检索退
  • unix下如何根据时间戳对文件进行排序? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 unix下如何根据时间戳对文件进行排序 我需要对文件进行排序 并根据它们创建的时间进行排序 文件修改 ls t 索引节点变化 ls tc 文件访问 l
  • 如何使用 docker ENTRYPOINT 与 shell 脚本文件组合参数

    我编写 shell 脚本文件并将其与 docker ENTRYPOINT 一起使用 但是当我运行 docker image 时 由于入口点代码行 它只是停止而没有任何错误日志 我的 Dockerfile FROM ubuntu 16 04
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • Bash:递归复制命名文件,保留文件夹结构

    我希望 cp R src prog js images icon jpg tmp package 将在目标目录中产生对称结构 tmp package src prog js images icon jpg 但相反 这两个文件都被复制到 tm
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任
  • C 有标准的队列实现吗?

    是否有 C 语言 附带 的队列数据结构实现 或者我必须开发自己的队列数据结构实现 这是一个学校项目 因此我必须使用标准 gcc 安装中存在的东西 或者必须自己实现一个 其他通用数据结构 如链表 堆栈等 又如何呢 尝试这个 Unix 附带了几
  • 如何用awk删除以“C”开头的行?

    如何使用以下命令从文本文件中删除以 C 开头的行awk 有什么建议请 如果数据在文件中data txt then With awk awk C data txt With grep grep v C data txt 显示开头不带 C 的所
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 使用 xlib 在屏幕顶部绘图

    我想在屏幕上的所有窗口顶部绘制一些图元 我在 C 中找到了一些代码并尝试将其移植以使用 python 的 xlib from Xlib display import Display from Xlib import X from Xlib
  • SVN 提交后挂钩在提交后不会运行

    我的服务器上设置了 SVN 存储库 并且遇到提交后问题 我在 iMac 上使用 SmartSVN 作为客户端 我通过 SmartSVN 的 ssh svn 连接 我能够成功连接到 SVN 并对其进行更改 但从 SVN 客户端提交后 我的提交
  • 在 AIX 中使用 Mailx 通过电子邮件发送 SQLPlus 查询结果的 Shell 脚本

    我有我需要的命令 如果我在提示符下执行这些命令 一切都会按预期进行 SQLPlus 运行查询 将结果导出到文件 然后 Mailx 将该文件通过电子邮件发送给我 sqlplus username pwd instance SPOOL home
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • 如何捕获 X 错误?

    我尝试在网上搜索 但我必须注意 找到有关 X 编程这方面的材料并不容易 我使用 X 和 GLX 来创建 OpenGL 上下文 我已经知道我当前的显卡驱动程序仅支持 OpenGL API 版本 3 3 但我希望我的应用程序能够尝试创建任何类型
  • 如何使用 UNIX shell 脚本删除平面文件的页眉和页脚记录?

    我有一个平面文件 如下所示 如何使用 UNIX shell 脚本从文件中删除页眉和页脚并重写同一文件 9 20050427 HEADER RECORD 0000000 00000 000000000 123456 00 654321 DAT

随机推荐

  • 如何在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文件中的数据