我有一个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的顺序的情况下没有任何工作。任何帮助非常感谢。
答案 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。这会删除前面的行,但由于它们是重复的,因此无关紧要。