【问题标题】:Compare 2 text files and output lines unique in only 1 file while ignoring case比较 2 个文本文件和仅在 1 个文件中唯一的输出行,同时忽略大小写
【发布时间】:2017-01-21 12:53:59
【问题描述】:

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

我在这里错过了什么?

【问题讨论】:

    标签: unix text diff comm


    【解决方案1】:

    您可以使用AwkPOSIX 兼容的字符串函数tolower 进行不区分大小写的查找。

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

    重定向到文件comparison.txt as

    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. 现在在file1.txt, 我可以匹配其他文件中的那些行 !(tolower($0) in unique) 这会给我所有这些行 file1.txt 其行不在file2.txt

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

    grep -viFxf file2.txt file1.txt
    Beth
    

    【讨论】:

    • @bullhorn:乐于助人!确保您了解用法以供将来参考!
    猜你喜欢
    • 2019-05-15
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2017-04-06
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多