2

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

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

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

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

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

4

3 回答 3

11

做这个:

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

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

于 2013-05-02T23:53:45.877 回答
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
于 2013-05-03T06:22:39.103 回答
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 先前答案的优雅概念:

  1. xmllint --format而不是cat, 来漂亮地打印 XML,因此每个 XML 元素都在一行上,如sort -u | wc. 其他漂亮的打印命令可能在这里工作,例如jq .json。
  2. 规范化空格的awk 命令:去除前导和尾随(因为两个文件中的缩进不同),并在内部折叠。警告:不考虑元素内的 XML 属性顺序。
于 2016-11-18T12:56:45.040 回答