使用bash或DOS查找两个列表之间不匹配的项

使用bash或DOS查找两个列表之间不匹配的项,bash,batch-file,Bash,Batch File,我有两个文件,其中有两个单列列表: //文件1-唯一值的完整列表 AAA BBB CCC //文件2 AAA AAA BBB BBB //所以这里的结果是: CCC 我需要从文件1生成一个在文件2中没有匹配项的值列表。我必须使用bash脚本(最好没有像awk这样的特殊工具)或DOS批处理文件 谢谢。方法1 看起来像是grep的s-v标志的作业 grep -v -F -f listtocheck uniques 方法2 Drake Clarris解决方案的一个变体(可以扩展到使用多个文件进行检

我有两个文件,其中有两个单列列表:

//文件1-唯一值的完整列表
AAA
BBB
CCC

//文件2
AAA
AAA
BBB
BBB

//所以这里的结果是:
CCC

我需要从文件1生成一个在文件2中没有匹配项的值列表。我必须使用bash脚本(最好没有像awk这样的特殊工具)或DOS批处理文件

谢谢。

方法1 看起来像是
grep
的s-v标志的作业

grep -v -F -f  listtocheck uniques
方法2 Drake Clarris解决方案的一个变体(可以扩展到使用多个文件进行检查,
grep
除非首先合并这些文件,否则无法进行检查)是:

(
    sort < file_to_check | uniq
    cat reference_file reference_file
) | sort | uniq -u
而不是
cat reference\u file reference\u file
,以获得较小的输出并减轻最终
排序的重量

优化二 如果我们使用临时文件,这将更快,因为可以高效地合并已排序的文件(并且在重复检查不同文件的情况下,我们可以重复使用相同的已排序参考文件,而无需重新排序);所以

sort < file_to_check  | uniq > .tmp.1
sort < reference_file | uniq > .tmp.2
# "--merge" works way faster, provided we're sure the input files are sorted
sort --merge .tmp.1 .tmp.2 .tmp.2 | uniq -u
rm -f .tmp.1 .tmp.2

对于Windows CMD解决方案(通常称为DOS,但不是真正的DOS):

它应该尽可能简单

findstr /vlxg:"file2" "file1"
但是,当存在多个文本搜索字符串时,可能会导致缺少匹配项

如果不区分大小写的搜索是可以接受的,那么添加
/I
选项可以避免该错误

findstr /vlixg:"file2" "file1"
如果您不受本机Windows命令的限制,则可以下载诸如grep for Windows之类的实用程序。用于Windows的Gnu实用程序是一个很好的源代码。然后你可以在Windows和nix上使用Isemi的解决方案


为Windows编写VBScript或JScript解决方案也很容易。

可能的重复:()也会从文件2中生成与文件1不匹配的单个条目
cat file1 file2 | sort | uniq -u
findstr /vlixg:"file2" "file1"
cat file1 file2 | sort | uniq -u