从文件中查找丢失的对

时间:2013-05-27 08:51:29

标签: linux sed awk grep

我想以下列方式从文件中找到丢失的对:

<itemA>
  <idA="312" />
</itemA>

<itemB>
  <idB="312" /> # has a corresponding itemA
</itemB>

<itemB>
  <idB="313" /> # doesn't have a corresponding itemA
</itemB>

我甚至不完全确定使用什么工具(sed,awk,grep)。

3 个答案:

答案 0 :(得分:2)

试试这个脚本:

#!/bin/bash

grep -oP '(?<=idA=")[0-9]+' input.xml | sort > a.txt

grep -oP '(?<=idB=")[0-9]+' input.xml | sort > b.txt

diff -y a.txt b.txt

以下内容可以避免创建临时文件的需要:

diff -y <(grep -oP '(?<=idA=")[0-9]+' input.xml) <(grep -oP '(?<=idB=")[0-9]+' input.xml)

答案 1 :(得分:2)

使用GNU grepuniq

$ grep -Po '(?<=id[AB]=")[0-9]+' file | uniq -u
313

如果您的输入未按排序顺序排列:

$ grep -Po '(?<=id[AB]=")[0-9]+' file | sort -n | uniq -u
313

答案 2 :(得分:0)

通常,您的任务需要XML解析器,因为XML格式化的自由度。您的输入也可能如此

<itemA>
  <
idA
=
"312" />
</itemA>

<itemB>
  <
idB
=
"312" /> # has a corresponding itemA
</itemB>

<itemB>
  <
idB
=
"313" /> # doesn't have a corresponding itemA
</itemB>

仍然是有效的XML,其含义与您的示例相同。在没有适当的XML解析器的情况下解析这个(以及我没有指出的其他可能的事情)是徒劳的任务。

如果您对输入的格式有更多了解,而不仅仅是它是有效的XML,那么您当然可以使用grepping来查找匹配对。

例如,如果您知道格式始终与发布格式一致,

valueA=""
grep '<id[AB]=' | while true
do
  if [ "$valueA" = "" ]
  then
    IFS='=' read dummy valueA
  fi
  IFS='=' read dummy valueB
  if [ "$valueA" != "$valueB" ]
  then
    echo "Missing B for $valueA"
    valueA=$valueB
  else
    valueA=""
  fi
done

可用于迭代整个输入。