求教大神
文本 A 如下
176.123.45.78
46.64.117.70
53.43.43.60
文本 B
fdiaofjao 176.123.45.78
hfoisjojo 46.64.117.70
fdsjfoaos 63.65.32.65
请问怎么判断文本 A 的内容被包含于于文本 B
1
lovebeyondalways OP 想做的是如果文本 A 有 ip 存在于文本 B 就将它输出
|
2
zhidian 2016-10-07 19:58:37 +08:00
选你能用的编程语言, 读入文本 A, 扫描出所有的 IP, 存入 dict 中, 读入文本 B,
依次扫描, 遇到 ip, 如果 ip 在 dict 中, 则输出之. that's easy. |
3
zhuangzhuang1988 2016-10-07 20:03:39 +08:00
|
4
northisland 2016-10-07 20:04:00 +08:00
N ( A )数量个 String Searching 问题(Substring)
(我记得最佳解法是用 KMP 算法) 欢迎拍砖~ |
5
northisland 2016-10-07 20:06:59 +08:00
后悔了,这是规则文本。
提取 IP ,搜索 IP 查找表,就可以了。 |
6
ldbC5uTBj11yaeh5 2016-10-07 20:08:50 +08:00
comm -12 a.txt <(awk '{print $2}' b.txt)
|
7
ldbC5uTBj11yaeh5 2016-10-07 20:10:19 +08:00
靠,看错了,居然是 python 节点。
(要啥自行车,用 shell 比 python 要快哒。) |
8
lovebeyondalways OP @jigloo 大哥 不好意思 我需要 Python 哈哈
|
9
lovebeyondalways OP @jigloo 因为这段代码要 放进项目用
|
10
ldbC5uTBj11yaeh5 2016-10-07 20:18:28 +08:00 1
@lovebeyondalways 呵呵,我就喜欢 oneliner , 拿去自己改吧改吧 (手动滑稽
python -c 'import sys; any(sys.stdout.write(i) for i in set(open(sys.argv[1])).intersection((x.split(" ")[1] for x in open(sys.argv[2]))))' a.txt b.txt |
11
northisland 2016-10-07 20:21:42 +08:00 via Android
lookup_tb = dict( (e, 1) for e in A)
for b in B: if b[b.rfind(' ')+1: ].strip() in lookup_tb: print 'b' |
12
lovebeyondalways OP @northisland 发送感谢
|
13
lovebeyondalways OP @jigloo 感谢已发送
|
14
owt5008137 2016-10-07 20:28:21 +08:00 via Android 1
@northisland KMP 是单个匹配,多个匹配可以试试 AC 自动机。
不过规则文本的话更简单的优化方式茫茫多 |
15
orange88 2016-10-07 21:34:46 +08:00 via Android
用 pandas 可以搞定
|
16
lululau 2016-10-07 21:51:44 +08:00
grep -vFf <(cut -d ' ' -f 2 B) A
|
17
SlipStupig 2016-10-07 22:39:14 +08:00
python set.difference()
difference(...) | Return the difference of two or more sets as a new set. | | (i.e. all elements that are in this set but not the others.) |
18
mickeyandkaka 2016-10-08 15:47:32 +08:00
difflib
|