用于从文本文件中提取特定模式的信息的脚本

时间:2016-10-03 19:31:58

标签: python bash shell pattern-matching data-processing

您好我正在处理一个处理大量数据的项目。我有一个大约2 GB的文本文件与键值对,每个键有多个值。 我需要提取不同文件中的所有密钥,因为我需要用于测试特定功能的密钥。

该文件的格式为:

:k: k1 :v: {XYZ:{id:"k1",score:0e0,tags:null},ABC:[{XYZ:{id:"k1",score:0e0,tags:null},PQR:[{id:"ID1",score:71.85e0,tags:[{color:"DARK"},{Type:"S1"},{color:"BLACK"}]},MetaData:{RuleId:"R3",Score:66.26327129015809e0,Quality:"GOOD"}},{XYZ:{id:"k1",score:0e0,tags:null},PQR:[..(same as above format)..],MetaData:{RuleId:"R3",Score:65.8234565409752e0,Quality:"GOOD"}} ::

//same pattern repeats with different keys, and a new line

当我使用CTRL + F在文件中搜索“:k:”时,这些键只会突出显示。所以我认为除了行的开头

之外,这种模式不在文件中

像这些有成千上万的钥匙。

我希望将所有这些密钥(k1,k2)提取到一个单独的文件中进行测试。

有多行:k:并希望在单独的文件中分隔(k1,k2,..)。我怎么能这样做?

Python也适合我。我可以在python中使用正则表达式,也可以使用“sed”shell命令。请在这里帮助我如何使用它们来提取密钥。

有人可以帮我写一个shell / python脚本吗?我知道它非常简单,但我对所有这些数据处理都是新手。

还专注于优化运行时间,因为数据非常大。

1 个答案:

答案 0 :(得分:0)

假设像

这样的文件
:k: k1 :v: {XYZ:{id:
:k2: k1 :v: {XYZ:{id:
:k: k1 :v: {XYZ:{id:
:k3: k1 :v: {XYZ:{id:
:k: k1 :v: {XYZ:{id:

您可以轻松地执行(1次传递),并且没有内存限制

awk '{fName=$1; gsub(/:/,"",fName); print >> fName ; close(fName)}' inFile

,它提供以下输出

$ cat k
:k: k1 :v: {XYZ:{id:
:k: k1 :v: {XYZ:{id:
:k: k1 :v: {XYZ:{id:
$ cat k2
:k2: k1 :v: {XYZ:{id:
$ cat k3
:k3: k1 :v: {XYZ:{id:

根据您拥有的密钥的不同,您可能不需要close(fName),但如果您不想花时间测试打开文件的限制,那么这是安全的方法。做这个过程。

IHTH