Python 比较两个未排序的文本文件以查找交叉点文件

Python 比较两个未排序的文本文件以查找交叉点文件,python,python-3.x,Python,Python 3.x,我有两个文本文件。一个是我使用RTL SDR接收的一组频率。这些频率在我周围的区域都是可用的。另一个是该地区所有注册频率的数据库。我的目标是找到未注册的频率。 我的数据库是: ARFCN:987,频率:927.6M,CID:36233,LAC:7713,MCC:410,MNC:4,压水堆:-37 ARFCN:989,频率:928.0M,CID:57501,LAC:7716,MCC:410,MNC:4,压水堆:-45 ARFCN:992,频率:928.6M,CID:58531,LAC:7716,M

我有两个文本文件。一个是我使用RTL SDR接收的一组频率。这些频率在我周围的区域都是可用的。另一个是该地区所有注册频率的数据库。我的目标是找到未注册的频率。 我的数据库是:

ARFCN:987,频率:927.6M,CID:36233,LAC:7713,MCC:410,MNC:4,压水堆:-37
ARFCN:989,频率:928.0M,CID:57501,LAC:7716,MCC:410,MNC:4,压水堆:-45
ARFCN:992,频率:928.6M,CID:58531,LAC:7716,MCC:410,跨国公司:4,压水堆:-42
ARFCN:994,频率:929.0M,CID:36231,LAC:7713,MCC:410,MNC:4,压水堆:-31
ARFCN:995,频率:929.2M,CID:36232,LAC:7713,MCC:410,MNC:4,压水堆:-39
ARFCN:999,频率:930.0M,CID:47081,LAC:7716,MCC:410,MNC:4,压水堆:-36
ARFCN:1004,频率:931.0M,CID:36231,LAC:7713,MCC:410,MNC:4,压水堆:-31
ARFCN:1008,频率:931.8M,CID:47103,LAC:7713,MCC:410,跨国公司:4,压水堆:-37
ARFCN:1010,频率:932.2M,CID:40691,LAC:7716,MCC:410,MNC:4,压水堆:-48
ARFCN:1011,频率:932.4M,CID:47102,LAC:7713,MCC:410,跨国公司:4,压水堆:-50
ARFCN:1,频率:935.2M,CID:13013,LAC:10421,MCC:410,MNC:1,压水堆:-65
ARFCN:2,频率:935.4M,CID:30889,LAC:10421,MCC:410,跨国公司:1,压水堆:-60
ARFCN:3,频率:935.6M,CID:30928,LAC:10470,MCC:410,跨国公司:1,压水堆:-45
ARFCN:3,频率:935.6M,CID:33272,LAC:10421,MCC:410,跨国公司:1,压水堆:-65
ARFCN:6,频率:936.2M,CID:10096,LAC:10470,MCC:410,MNC:1,压水堆:-27
ARFCN:10,频率:937.0M,CID:30911,LAC:10470,MCC:410,MNC:1,压水堆:-47
ARFCN:25,频率:940.0M,CID:14429,LAC:51136,MCC:410,MNC:3,压水堆:-44
ARFCN:49,频率:944.8M,CID:15535,LAC:52207,MCC:410,跨国公司:3,压水堆:-27
ARFCN:51,频率:945.2M,CID:12408,LAC:51136,MCC:410,MNC:3,压水堆:-46
ARFCN:54,频率:945.8M,CID:35535,LAC:52207,MCC:410,跨国公司:3,压水堆:-49
ARFCN:56,频率:946.2M,CID:25535,LAC:52207,MCC:410,跨国公司:3,压水堆:-51
ARFCN:58,频率:946.6M,CID:12941,LAC:51136,MCC:410,跨国公司:3,压水堆:-35
ARFCN:60,频率:947.0M,CID:18662,LAC:51136,MCC:410,MNC:3,压水堆:-58
ARFCN:62,频率:947.4M,CID:32941,LAC:51136,MCC:410,跨国公司:3,压水堆:-52
ARFCN:64,频率:9478M,CID:7673,LAC:470,MCC:410,跨国公司:6,压水堆:-43
ARFCN:66,频率:948.2M,CID:10001,LAC:470,MCC:410,MNC:6,压水堆:-27
ARFCN:68,频率:948.6M,CID:12941,LAC:51136,MCC:410,跨国公司:3,压水堆:-50
ARFCN:70,频率:949.0M,CID:15132,LAC:470,MCC:410,MNC:6,压水堆:-34
ARFCN:71,频率:949.2M,CID:5373,LAC:470,MCC:410,MNC:6,压水堆:-44
ARFCN:75,频率:950.0M,CID:6561,LAC:470,MCC:410,MNC:6,压水堆:-45
ARFCN:79,频率:950.8M,CID:10003,LAC:470,MCC:410,MNC:6,压水堆:-48
ARFCN:82,频率:951.4M,CID:10002,LAC:470,MCC:410,跨国公司:6,压水堆:-34
ARFCN:86,频率:952.2M,CID:0,LAC:470,MCC:410,MNC:6,压水堆:-57
ARFCN:117,频率:958.4M,CID:20096,LAC:10470,MCC:410,跨国公司:1,压水堆:-28
ARFCN:119,频率:958.8M,CID:12549,LAC:10470,MCC:410,跨国公司:1,压水堆:-41
ARFCN:120,频率:959.0M,CID:30096,LAC:10470,MCC:410,MNC:1,压水堆:-31
ARFCN:122,频率:959.4M,CID:33783,LAC:10421,MCC:410,跨国公司:1,压水堆:-42
ARFCN:124,频率:959.8M,CID:42549,LAC:10470,MCC:410,跨国公司:1,压水堆:-33
鉴于我收到的频率文件为:

脚本开始于2020-07-19 14:55:19+0500
linux;GNU C++版本7.3.0;boost106501;UHD_003.010.003.000-0-未知
ARFCN:1004,频率:931.0M,CID:36231,LAC:7713,MCC:410,MNC:4,压水堆:-34
ARFCN:1008,频率:931.8M,CID:47103,LAC:7713,MCC:410,跨国公司:4,压水堆:-30
ARFCN:6,频率:936.2M,CID:10096,LAC:10470,MCC:410,MNC:1,压水堆:-27
ARFCN:10,频率:937.0M,CID:30911,LAC:10470,MCC:410,MNC:1,压水堆:-33
ARFCN:49,频率:944.8M,CID:15535,LAC:52207,MCC:410,跨国公司:3,压水堆:-28
ARFCN:56,频率:946.2M,CID:0,LAC:0,MCC:0,MNC:0,压水堆:-50
ARFCN:66,频率:948.2M,CID:10001,LAC:470,MCC:410,MNC:6,压水堆:-27
ARFCN:79,频率:950.8M,CID:10003,LAC:470,MCC:410,MNC:6,压水堆:-43
ARFCN:82,频率:951.4M,CID:10002,LAC:470,MCC:410,跨国公司:6,压水堆:-36
ARFCN:100,频率:955.0M,CID:667,LAC:1007,MCC:410,MNC:3,压水堆:-27
脚本于2020-07-19 14:58:05+0500完成
可以看出,两个列表都未排序。现在,我打算在ubuntu终端上创建一个新的文本文件或atcleast输出,以便显示我当前频率列表中的频率,但不显示在数据库中。到目前为止,我还没找到黑客。我编写了一个shell脚本:

#! /bin/sh
clear
echo "                      */\*/\*/\*/\*/\*/\*/\*/\*/\*/\*/\*/\* "
echo "                      C O N F L I C T I N G   A R F C N s "
echo "                      *\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/* "
echo UNIQUE BTS TOWERS ARE


import bitarray
r = bitarray.bitarray(5000000000)

for line in open(alpha.txt):
    r[int(line)] = True

for line in open(Database.txt):
    if r[int(line)]:
        print line
#set(open(alpha.txt)) & set(open(Database.txt))
#sort Database.txt alpha.txt | uniq -u
#comm -3 alpha.txt Database.txt
#   Print lines in alpha.txt not in Database.txt
#words1 = set(open("Database.txt").read().split())
#words2 = set(open("alpha.txt").read().split())

#duplicates = words1.intersection(words2)
#uniques = words1.difference(words2).union(words2.difference(words1))

#print "Duplicates(%d):%s"%(len(duplicates),duplicates)
#print "\nUniques(%d):%s"%(len(uniques),uniques)


echo "The scan GSM frequencies are collected"
notify-send "COLLECTED!"
echo DONE!
我已经尝试过所有这些选择,但没有一个真正有效

db = open('Database.txt', 'r') 
dbLines = db.readlines()
alpha = open('alpha.txt', 'r') 
alphaLines = alpha.readlines()
output=[line for line in alphaLines if line not in  dbLines and line.startswith('ARFCN') ]
输出:

    ['ARFCN: 1004, Freq:  931.0M, CID: 36231, LAC:  7713, MCC: 410, MNC:   4, Pwr: -34\n',
 'ARFCN: 1008, Freq:  931.8M, CID: 47103, LAC:  7713, MCC: 410, MNC:   4, Pwr: -30\n',
 'ARFCN:   10, Freq:  937.0M, CID: 30911, LAC: 10470, MCC: 410, MNC:   1, Pwr: -33\n',
 'ARFCN:   49, Freq:  944.8M, CID: 15535, LAC: 52207, MCC: 410, MNC:   3, Pwr: -28\n',
 'ARFCN:   56, Freq:  946.2M, CID:     0, LAC:     0, MCC:   0, MNC:   0, Pwr: -50\n',
 'ARFCN:   79, Freq:  950.8M, CID: 10003, LAC:   470, MCC: 410, MNC:   6, Pwr: -43\n',
 'ARFCN:   82, Freq:  951.4M, CID: 10002, LAC:   470, MCC: 410, MNC:   6, Pwr: -36\n',
 'ARFCN:  100, Freq:  955.0M, CID:   667, LAC:  1007, MCC: 410, MNC:   3, Pwr: -27\n']

下面是一个简单的GNU awk,它完成了(我认为)您正在尝试做的事情:

$ gawk 'BEGIN{FS=OFS=", "} NR==FNR{db[$1 $2 $3 $4 $5 $6]; next}
        $1~/ARFCN: / && !($1 $2 $3 $4 $5 $6 in db)' db.txt rec.txt
印刷品:

ARFCN:   56, Freq:  946.2M, CID:     0, LAC:     0, MCC:   0, MNC:   0, Pwr: -50
ARFCN:  100, Freq:  955.0M, CID:   667, LAC:  1007, MCC: 410, MNC:   3, Pwr: -27
ARFCN: 1004, Freq:  931.0M, CID: 36231, LAC:  7713, MCC: 410, MNC:   4, Pwr: -34
ARFCN: 1008, Freq:  931.8M, CID: 47103, LAC:  7713, MCC: 410, MNC:   4, Pwr: -30
ARFCN:   10, Freq:  937.0M, CID: 30911, LAC: 10470, MCC: 410, MNC:   1, Pwr: -33
ARFCN:   49, Freq:  944.8M, CID: 15535, LAC: 52207, MCC: 410, MNC:   3, Pwr: -28
ARFCN:   56, Freq:  946.2M, CID:     0, LAC:     0, MCC:   0, MNC:   0, Pwr: -50
ARFCN:   79, Freq:  950.8M, CID: 10003, LAC:   470, MCC: 410, MNC:   6, Pwr: -43
ARFCN:   82, Freq:  951.4M, CID: 10002, LAC:   470, MCC: 410, MNC:   6, Pwr: -36
ARFCN:  100, Freq:  955.0M, CID:   667, LAC:  1007, MCC: 410, MNC:   3, Pwr: -27
这是通过比较前6个字段并忽略
Pwr
来实现的,因为这可能随条件而变化

如果所有字段都相关,则可以简化为:

$ gawk 'BEGIN{FS=OFS=", "} NR==FNR{db[$0]; next}
       $1~/ARFCN: / && !($0 in db)' db.txt rec.txt
印刷品:

ARFCN:   56, Freq:  946.2M, CID:     0, LAC:     0, MCC:   0, MNC:   0, Pwr: -50
ARFCN:  100, Freq:  955.0M, CID:   667, LAC:  1007, MCC: 410, MNC:   3, Pwr: -27
ARFCN: 1004, Freq:  931.0M, CID: 36231, LAC:  7713, MCC: 410, MNC:   4, Pwr: -34
ARFCN: 1008, Freq:  931.8M, CID: 47103, LAC:  7713, MCC: 410, MNC:   4, Pwr: -30
ARFCN:   10, Freq:  937.0M, CID: 30911, LAC: 10470, MCC: 410, MNC:   1, Pwr: -33
ARFCN:   49, Freq:  944.8M, CID: 15535, LAC: 52207, MCC: 410, MNC:   3, Pwr: -28
ARFCN:   56, Freq:  946.2M, CID:     0, LAC:     0, MCC:   0, MNC:   0, Pwr: -50
ARFCN:   79, Freq:  950.8M, CID: 10003, LAC:   470, MCC: 410, MNC:   6, Pwr: -43
ARFCN:   82, Freq:  951.4M, CID: 10002, LAC:   470, MCC: 410, MNC:   6, Pwr: -36
ARFCN:  100, Freq:  955.0M, CID:   667, LAC:  1007, MCC: 410, MNC:   3, Pwr: -27
或者,如果您只想比较
ARFCN
字段:

$ gawk 'BEGIN{FS=OFS=", "} NR==FNR{db[$1]; next}
        $1~/ARFCN: / && !($1 in db)' db.txt rec.txt
ARFCN:  100, Freq:  955.0M, CID:   667, LAC:  1007, MCC: 410, MNC:   3, Pwr: -27

你明白了…

Python 3。取两组直线的交点。打印它们

print(*(set(open('alpha.txt')) & set(open('Databse.txt'))), sep='')

只要两个文件都能放在内存中,它就可以工作。

为什么要将其标记为Python?这很有局限性:文件以shell脚本
#开头/bin/sh
,然后继续作为Python(Python2-因为print语句),问题被标记为Python3…嘿,如果我有两个值相同的条目,比如说相同的ARFCN,我该怎么办。我该如何编写代码来挑出这一行呢?恐怕我不理解你的问题好的,所以我收到的数据,假设我们有两行,并且都有相同的ARFCN(例如25)。我需要一个代码指导,该代码将在输出中给出一个实例,其中两个带有ARFCN 25的条目都将显示。