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

时间:2017-01-21 12:54:00

标签: unix text diff comm

我有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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

您可以将AwkPOSIX兼容的字符串函数tolower一起用于执行不区分大小写的查找。

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

重定向到文件comparison.txt

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

逻辑背后的想法是

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

  1. FNR==NR{unique[tolower($0)]++; next}将在file2.txt处理 存储数组的条目作为案例的敏感词直到 file2.txt
  2. 的结尾
  3. 现在在file1.txt,我可以通过执行来匹配其他文件中的这些行 !(tolower($0) in unique)这将为我提供所有这些行 file1.txt
  4. 中不存在其行的file2.txt

    (或)如果您使用文件上的否定匹配访问GNU grep-i用于护理不敏感的查找

    grep -viFxf file2.txt file1.txt
    Beth
    
相关问题