如何从两个文件中提取不常见的不区分大小写的文本?

如何从两个文件中提取不常见的不区分大小写的文本?

我正在尝试从文件中提取不常见的文本,并且我尝试过这样做:

awk 'FNR==NR {a[$0]++; next} !a[$0]' 1.txt 2.txt
http://PQR.com
http://example.com

以下是输入文件:

File: 1.txt
http://google.com
http://GOOGLE.com
http://example1.com
http://seperate.com
http://pqr.com
File: 2.txt
http://PQR.com
http://example.com
http://google.com

如您所见,在文件和中http://pqr.com可用。结果显示,这在两个文件中都是常见的。因此,我如何才能仅显示不常见的文本(不依赖于文本的大小写)?1.txthttp://PQR.com2.txthttp://PQR.com

答案1

由于您已经在使用awk,请使用tolower将以下行小写:

awk 'FNR==NR {a[tolower($0)]++; next} !a[tolower($0)]' foo bar

但是,这只会打印 中bar不存在的行foo

与之比较:

$ sort -f bar foo | uniq -iu
http://example.com
http://example1.com
http://seperate.com

使用awk,您还需要打印只出现过一次的每一行:

$ awk '{a[tolower($0)]++} END {for (i in a) if (a[i] == 1) print i}' foo bar
http://seperate.com
http://example.com
http://example1.com

答案2

这是一项非常简单的工作grep

grep -viFf file2.txt file1.txt
  • -v显示不匹配的行
  • -i启用不区分大小写
  • -F使图案变得文字化
  • -f file1.txtfile1.txt逐行读取要匹配的模式

例子:

% cat file1.txt 
http://google.com
http://GOOGLE.com
http://example1.com
http://seperate.com
http://pqr.com

% cat file2.txt 
http://PQR.com
http://example.com
http://google.com

% grep -viFf file2.txt file1.txt
http://example1.com
http://seperate.com

答案3

这是一个使用高效集合实现的 Python 解决方案,用于 nicen+)性能(n是两个输入文件的大小)。

代码

#!/usr/bin/python3
import sys

with open(sys.argv[1]) as A_file:
    A = frozenset(map(str.casefold, map(str.rstrip, A_file)))

with open(sys.argv[2]) as B_file:
    B = map(str.rstrip, B_file))
    B_minus_A = filter(lambda s: s.casefold() not in A, B)
    print(*B_minus_A, sep='\n')

使用示例

python3 casefold-difference.py 1.txt 2.txt

解释

  • 该程序使用casefold用于字符串比较,但返回 中出现的行2.txt。 大小写折叠是进行自然语言不区分大小写的比较的推荐方法。 如果这不是您想要的(因为 URL 实际上不是自然语言),您可以将其替换为lower

  • 如果2.txt有大量的行(未出现在中1.txt),则在最后一条语句中创建可变参数列表可能会消耗相当多的内存,您最好用这样的循环来替换它:

    for item in B_minus_A:
        print(item)
    

相关内容