比较 2 个文本文件和仅在 1 个文件中唯一的输出行,同时忽略大小写

Compare 2 text files and output lines unique in only 1 file while ignoring case

我有 2 个大文本文件 file1.txtfile2.txt

每个文件包含一个以行分隔的名称列表,例如

file1.txt

Beth
james
James
paul
Paul
sally

file2.txt

James
Paul
Sally

我想生成一个只包含 file1.txt 唯一名称的文件,同时忽略大小写,因此在上面的示例中,我想要生成一个如下所示的文件:

comparison.txt

Beth

使用命令 comm -23 file1.txt file2.txt > comparison.txt 产生了错误的结果:

Beth
james
paul
sally

使用 -i 命令也会产生不正确的结果:

Beth
James
Paul

我在这里错过了什么?

您可以使用 AwkPOSIX 兼容 string-function tolower 进行不区分大小写的查找。

awk 'FNR==NR{unique[tolower([=10=])]++; next}!(tolower([=10=]) in unique)' file2.txt file1.txt
Beth

re-direct 到文件 comparison.txt

awk 'FNR==NR{unique[tolower([=11=])]++; next}!(tolower([=11=]) in unique)' file2.txt file1.txt > comparison.txt
cat comparison.txt
Beth

逻辑背后的想法是

所以我对解决方案的理解如下,

  1. FNR==NR{unique[tolower([=17=])]++; next} 将在 file2.txt 处理 将数组的条目存储为 case in-sensitive 个单词直到 file2.txt.
  2. 结束
  3. 现在 file1.txt, 我可以匹配其他文件中的那些行 !(tolower([=21=]) in unique) 这将给我所有这些行 file1.txt 其行不存在于 file2.txt

(or) 如果您使用文件的否定匹配访问 GNU grep,使用 -i 表示不区分大小写 look-up

grep -viFxf file2.txt file1.txt
Beth