您好我正在处理一个处理大量数据的项目。我有一个大约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脚本吗?我知道它非常简单,但我对所有这些数据处理都是新手。
还专注于优化运行时间,因为数据非常大。
答案 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