awk打印匹配模式的行

时间:2016-09-08 20:58:24

标签: bash awk pattern-matching match

我的mpd如下所示。文件名为mpd

<BaseURL>01/</BaseURL>
   <SegmentList timescale="1000">
   <SegmentURL media="1.ts" mediaRange="0-6003779"/>
   <SegmentURL media="2.ts" mediaRange="0-7313387"/>
   <BaseURL>02/</BaseURL>
   <SegmentList timescale="1000">            
   <SegmentURL media="1.ts" mediaRange="0-6003779"/>
   <SegmentURL media="2.ts" mediaRange="0-7313387"/>
   <BaseURL>01/</BaseURL>
   <SegmentList timescale="1000">
   <SegmentURL media="3.ts" mediaRange="0-6003779"/>
   <SegmentURL media="4.ts" mediaRange="0-7313387"/>    
   <BaseURL>02/</BaseURL>
   <SegmentList timescale="1000">
   <SegmentList timescale="1000">
   <SegmentURL media="3.ts" mediaRange="0-6003779"/>
   <SegmentURL media="4.ts" mediaRange="0-7313387"/>

我想将每个<segment URL的{​​{1}}行保存到不同的文件中

我想要的输出是

<BaseURL>

我已经尝试了以下命令,它没有按预期工作任何帮助将不胜感激。下面的命令只打印mpd文件中的最后一个段URL。我很困惑为什么awk只打印段url的最后一个条目

<BaseURL>01/</BaseURL>
    <SegmentURL media="1.ts" mediaRange="0-6003779"/>
    <SegmentURL media="2.ts" mediaRange="0-7313387"/>
    <SegmentURL media="3.ts" mediaRange="0-6003779"/>
    <SegmentURL media="4.ts" mediaRange="0-7313387"/>

2 个答案:

答案 0 :(得分:0)

  awk '
# start writing to new segment file segment.01 etc
match($0, /<BaseURL>([0-9]+)\/<\/BaseURL>/, m) {
  base=m[1]
  close(segf)
  segf="segment." base
  print "write segments to " segf
  print >>segf
}
/<SegmentURL / {print >segf}
END {close(segf)}
' mpd

答案 1 :(得分:0)

这是我的答案

cat dfg | awk'function writeFile(a){print $ 0 >>“ File_” a; } BEGIN {FS =“ [<,>,=]”; a = 0;} {if($ 2 ==“ BaseURL”){a ++; writeFile(a)} else if($ 2 ==“ SegmentURL media”){ writeFile(a)}}'

说明:-使用多个文件分隔符可以准确地进行比较并提取所需的行,并在每次获取BaseURL时保留一个计数器。递增计数器并将其传递给awk中的用户定义功能(每次遇到BaseURL都会随着计数器的更改而打开用于写入的新文件) 我们为编写基于文件的输出所做的

输出:-

文件1_4 文件1_3 文件1_2 File1_1