我正在尝试从文件中提取不常见的文本,并且我尝试过这样做:
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.txt
http://PQR.com
2.txt
http://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.txt
file1.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 解决方案,用于 nice哦(n+米)性能(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)