2013-05-02 105 views
2

首先,我很抱歉,这可能是一个相当愚蠢的问题,但并不完全属于此处。如何确定一个文件的内容是否包含在另一个文件的内容中

这是我的问题:我有两个大文本文件包含大量文件名称,我们称它们为A和B,并且我想确定A是否为B的子集,无视顺序,即对于每个文件名A,找到文件名是否也在B中,否则A不是子集。

我知道如何对文件进行预处理(除去文件名本身,除去不同的大写字母),但现在我只是想知道是否有一种简单的方法来使用shell命令执行任务。

差异可能不起作用,对吧?即使我首先对这两个文件进行“排序”,至少两个文件的排列顺序是相同的,因为A可能是B的子集,diff会告诉我每一行都是不同。

再说一遍,如果这个问题不属于这里,并且最后如果没有简单的方法去做,我只会写一个小程序来完成这项工作,但是因为我试图更好地处理shell命令,我想我会先在这里问。

+0

好问题! +1;)使用'sort'和'diff'的问题是什么?看起来不错。 – hek2mgl 2013-05-02 23:53:23

+0

也许是我的差异的理解是缺乏的,但说文件A包含: AAA CCC 和B包含: AAA BBB CCC 差异只会告诉我,第2行是不匹配的,但我想要的它要做的是告诉我ccc是*在某处发现的。如果diff的选项存在,即使在阅读手册页之后,我也不知道它。 – tonfagun 2013-05-02 23:58:41

+0

所以你想做一个基于行的包括检查,而不是基于块(文件的整个内容作为块)? – Kent 2013-05-03 00:09:05

回答

11

这样做:

cat b | sort -u | wc 
cat a b | sort -u | wc 

如果你得到同样的结果,A是B的子集。

+0

不错! ......... – hek2mgl 2013-05-02 23:54:53

+0

似乎工作(在两个小测试文件)。现在我只需要找出它为什么会起作用。但那是我的问题,所以:谢谢! – tonfagun 2013-05-03 00:08:20

+0

现在得到它:)非常聪明的解决方案。 – tonfagun 2013-05-03 00:22:55

0

这里是如何做到这一点的AWK

awk ' 
    # read A, the supposed subset file 
    FNR == NR {a[$0]; next} 
    # process file B 
    $0 in a {delete a[$0]} 
    END {if (length(a) == 0) {print "A is a proper subset of B"}} 
' A B 
0

测试如果XSD文件是WSDL文件的一个子集:

xmllint --format file.wsdl | awk '{$1=$1};1' | sort -u | wc 
xmllint --format file.wsdl file.xsd | awk '{$1=$1};1' | sort -u | wc 

这适应使用RichieHindle事先answer优雅的概念:

  1. xmllint --format而不是cat,以漂亮的打印XM L,因此每个XML元素都在一行上,如sort -u | wc所要求的那样。其他漂亮的打印命令可能在这里工作,用于json的jq .
  2. awkcommand以规范化空白:剥离前导和尾随(因为两个文件中的缩进不同),并折叠内部。警告:不考虑元素内的XML属性顺序。
相关问题