基于RTL SDR采集频率与注册数据库对比查找未注册频率的问询
我来帮你搞定这个问题!之前用Shell脚本没成功大概率是因为频率匹配的格式或者字段提取没处理好,下面给你几个靠谱的方案,根据你的文件格式选就行:
先明确前提(你可以根据实际情况调整)
假设:
- 采集到的频率文件叫
collected_freqs.txt,每行仅包含一个频率值(比如900.123) - 注册数据库文件叫
registered_db.txt,包含表头(比如ARFCN Freq CID),频率在第二列,用空格/制表符分隔
方案1:精准字符串匹配(最常用)
适合两个文件里的频率格式完全一致的情况,直接提取数据库里的频率,再对比采集文件:
# 一步到位,直接输出到终端 grep -vxFf <(grep -v "^ARFCN" registered_db.txt | awk '{print $2}') collected_freqs.txt # 要输出到新文件的话,加重定向 grep -vxFf <(grep -v "^ARFCN" registered_db.txt | awk '{print $2}') collected_freqs.txt > unregistered_freqs.txt
参数解释:
-v:反向匹配(找不在注册列表里的内容)-x:整行匹配(避免比如900.12和900.123被误判为匹配)-F:把搜索内容当作固定字符串(不是正则表达式)-f <(...):从管道输出里读取要排除的频率列表grep -v "^ARFCN":跳过数据库的表头行
方案2:处理数值精度差异
如果采集的频率和数据库里的频率存在小数精度差异(比如采集是900.123,数据库是900.12),用awk做数值对比更稳妥:
# 基础版:直接匹配数值 awk ' NR==FNR { if (NR>1) db_freqs[$2]=1; next } { if (!db_freqs[$0]) print $0 } ' registered_db.txt collected_freqs.txt > unregistered_freqs.txt # 带误差容忍版:允许±0.001的精度差异 awk -v tolerance=0.001 ' NR==FNR { if (NR>1) db_freqs[$2]=1; next } { found=0 for (f in db_freqs) { if (abs($0 - f) <= tolerance) { found=1 break } } if (!found) print $0 } function abs(x) { return x < 0 ? -x : x } ' registered_db.txt collected_freqs.txt
方案3:数据库是CSV格式(逗号分隔)
如果你的注册数据库是CSV(比如ARFCN,Freq,CID),只需要修改awk的分隔符:
grep -vxFf <(grep -v "^ARFCN" registered_db.csv | awk -F, '{print $2}') collected_freqs.txt
方案4:大文件高效对比(用comm命令)
如果文件特别大,先排序再用comm命令会更快:
# 先分别排序两个频率列表 sort collected_freqs.txt > sorted_collected.txt grep -v "^ARFCN" registered_db.txt | awk '{print $2}' | sort > sorted_registered.txt # 找出仅在采集文件里出现的频率 comm -23 sorted_collected.txt sorted_registered.txt > unregistered_freqs.txt
参数解释:comm -23 表示只显示第一个文件独有的行。
额外注意事项
- 如果频率带单位(比如
900.123 MHz),要先统一格式,比如用sed 's/ MHz//' collected_freqs.txt去掉单位 - 如果数据库表头不是
ARFCN,把grep -v "^ARFCN"里的字符串换成你的实际表头内容
内容的提问来源于stack exchange,提问作者mosterup
相关产品推荐
相关产品推荐

