如何确定一个文件的内容是否包含在另一个文件的内容中

时间:2013-05-02 23:50:05

标签: linux shell diff

首先,我对可能是一个相当愚蠢的问题表示道歉,这个问题并不完全属于这里。

这是我的问题:我有两个包含大量文件名的大文本文件,我们称之为A和B,我想确定A是否是B的子集,忽略顺序,即A中的每个文件名,查找文件名是否也在B中,否则A不是子集。

我知道如何预处理文件(删除除文件名本身以外的任何内容,删除不同的大小写),但现在我不知道是否有一种简单的方法可以使用shell命令执行任务。

差异可能不起作用,对吗?即使我首先对这两个文件进行“排序”,这样至少两个文件中的文件将按相同的顺序排列,因为A可能是B的正确的子集,diff只会告诉它我认为每条线都不同。

再次,如果这个问题不属于这里,我很抱歉,最后,如果没有简单的方法,我会写一个小程序来完成这项工作,但是因为我想要得到更好地处理shell命令,我想我先问这里。

3 个答案:

答案 0 :(得分:11)

这样做:

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

如果得到相同的结果,则a是b的一个子集。

答案 1 :(得分: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

答案 2 :(得分: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

这使用了以前的answer来优化RichieHindle的优雅概念:

  1. xmllint --format而不是cat,可以按照sort -u | wc的要求,在每行上打印XML,以便每个XML元素都在一行上。其他漂亮的打印命令可能在这里起作用json jq .
  2. awk command来规范化空格:剥离前导和尾随(因为两个文件中的缩进不同),并且内部崩溃。警告:不考虑元素中的XML属性顺序。