首先,我对可能是一个相当愚蠢的问题表示道歉,这个问题并不完全属于这里。
这是我的问题:我有两个包含大量文件名的大文本文件,我们称之为A和B,我想确定A是否是B的子集,忽略顺序,即A中的每个文件名,查找文件名是否也在B中,否则A不是子集。
我知道如何预处理文件(删除除文件名本身以外的任何内容,删除不同的大小写),但现在我不知道是否有一种简单的方法可以使用shell命令执行任务。
差异可能不起作用,对吗?即使我首先对这两个文件进行“排序”,这样至少两个文件中的文件将按相同的顺序排列,因为A可能是B的正确的子集,diff只会告诉它我认为每条线都不同。
再次,如果这个问题不属于这里,我很抱歉,最后,如果没有简单的方法,我会写一个小程序来完成这项工作,但是因为我想要得到更好地处理shell命令,我想我先问这里。
答案 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的优雅概念:
xmllint --format
而不是cat
,可以按照sort -u | wc
的要求,在每行上打印XML,以便每个XML元素都在一行上。其他漂亮的打印命令可能在这里起作用json jq .
。awk
command来规范化空格:剥离前导和尾随(因为两个文件中的缩进不同),并且内部崩溃。警告:不考虑元素中的XML属性顺序。