删除xml文件中没有sort或unique的重复连续行

时间:2015-01-07 03:43:50

标签: regex xml bash awk sed

我有一个xml文件,我需要保留标签的顺序,但是有一个名为media的标签,它有连续顺序的重复行。我想删除其中一个重复的媒体标签,但希望保留所有的父标签 - (也是连续的和重复的)。我想知道是否有一个awk解决方案只有在模式匹配时才能删除。例如:

<story>
   <article>
      <media>One line</media>
      <media>One line</media>    <-- Same line as above, want to delete this
      <media>Another Line</media>
      <media>Another Line</media>  <-- Another duplicate, want to delete this
   </article>
</story>
<story>
   <article>
     ........ and so on

我想保留连续的故事和文章标签,只删除媒体标签的重复项。我已经尝试了许多awk脚本,但似乎在没有排序文件和破坏xml的顺序的情况下没有任何工作。任何帮助非常感谢。

4 个答案:

答案 0 :(得分:5)

awk脚本可以帮助你

awk '!(f == $0){print} {f=$0}' input

<强>测试

$ cat input
<story>
   <article>
      <media>One line</media>
      <media>One line</media>
      <media>Another Line</media>
      <media>Another Line</media>
this
   </article>
</story>
<story>
   <article>

$ awk '!(f == $0){print} {f=$0}' input
<story>
   <article>
      <media>One line</media>
      <media>Another Line</media>
this
   </article>
</story>
<story>
   <article>

$ awk 'f!=$0&&f=$0' input

感谢Jidder

答案 1 :(得分:2)

考虑文件:

$ cat file
<story>
   <article>
      <media>One Line</media>
      <media>One Line</media>
      <media>Another Line</media>
      <media>Another Line</media>
   </article>
</story>
<story>
   <article>
     ........ and so on

删除重复的媒体行并仅删除媒体行:

$ awk '/<media>/ && $0==last{next} {last=$0} 1' file
<story>
   <article>
      <media>One Line</media>
      <media>Another Line</media>
   </article>
</story>
<story>
   <article>
     ........ and so on

如何运作

  • /<media>/ && $0==last{next}

    任何与<media>标记匹配的行都会被跳过:命令next告诉awk跳过所有剩余的命令并重新开始在下一个行。

  • last=$0

    这会将最后一行全部保存在变量last中。

  • 1

    这是神秘的awk符号,表示打印当前行。如果您希望简洁明了,可以将1替换为{print $0}

答案 2 :(得分:2)

使用通常需要排序文件的uniq行为,删除紧跟前一行

的重复行
uniq YourFile

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r 'N;/^(\s*<media>.*)\n\1$/!P;D' file

这会删除以<media>标记开头的重复行。

N.B。这会删除前面的行,但由于它们是重复的,因此无关紧要。