demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm
fck=83;fcv=naismc;fcv=naisjdf;fck=83;fmd=1422811694,;fmd=1422811694;
fck=83;fcv=demelog;fck=83;fmd=1423134370;
fck=83;fcv=demelog;fck=83;fmd=1422292546;
fck=83;fcv=demelog;fck=83;fmd=1421774352;
fck=83;fcv=decoccm;fck=83;fmd=1422853444;
fck=83;fcv=voyapro;fck=83;fmd=1422270462;
fck=83;fcv=voyapro;fcv=demelog;fck=83;fmd=1422183999,;fmd=1422206234,;
如你所见,从fck = 83开始,我可以获得第2行fcv = demelog和相关的fmd 1423134370或第7行,fcv = voyapro和fcv = demelog以及相关的fmd以及fmd = 1422183999和fmd = 1422206234 ;
你还记得第一行demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm?
我的目标是采用以下格式(我将使用第2行和第7行作为示例)
第2行
fck=83;fcv=demelog;;;;;;;;;fck=83;fmd=1423134370;;;;;;;;;
第7行
fck=83;;fcv=voyapro;;;;;;;;;fck=83;;fmd=1422270462;;;;;;;;;
正如你所看到的,我为fcv和fmd添加了额外的列fck = 83,与此demelog相关voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm
我想用awk或sed或python来做这件事,即使我不知道如何用python或awk和sed做这件事.
也许我可以在一个单独的文件中添加demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm然后用索引进行搜索.如果字符串在这里,我什么都不做.如果它不在这里,我正在添加一个额外的列.
欢迎任何帮助,因为我很困惑我应该从技术上说到哪里,并开始拉我的头发.
更新
这是我在python下面的尝试
import re
word_list= ['fcv=demelog','fcv=voyapro','fcv=naisjdf','fcv=naismc','fcv=decoide','fcv=decoccm','fcv=travide','fcv=travccm','fcv=equiccm','fcv=mariccm']
regex_string = "(?<=\W)(%s)(?=\W)" % ";".join(word_list)
find=re.compile(regex_string)
with open ("idcacf_v5.txt", "r") as myfile:
data=myfile.read().replace('\n', '')
finder = re.compile(regex_string)
string_to_be_searched = data
results = finder.findall ("%s " % string_to_be_searched)
result_set = set(results)
for word in word_list:
print ("%s in string" % word)
如你所见,我需要2件事,才能索引.第二件事是我需要能够在顺序方面复制我对fcv所做的事情,并使用该行的fmd = timestamp进行相同的顺序.
解决方法:
这是我使用CSV模块拼凑的东西:
#! /usr/bin/env python3
import csv, sys
word_list = ['fcv=demelog','fcv=voyapro','fcv=naisjdf','fcv=naismc','fcv=decoide','fcv=decoccm','fcv=travide','fcv=travccm','fcv=equiccm','fcv=mariccm']
csvin = csv.reader (sys.stdin, delimiter=';')
csvout = csv.writer (sys.stdout, delimiter=';')
for row in csvin:
word_list_fck = [row[0]] + word_list
fmd_start = row[1:].index(row[0]) + 1
row_fcv = row[:fmd_start] # split fcv from fmd
row_fmd = row[fmd_start:]
out_row = [entry if entry in row_fcv else '' for entry in word_list_fck]
out_row = out_row + [row_fmd.pop(0) if out_row[i] != '' else '' for i in range(len(word_list_fck))]
csvout.writerow (out_row)
示例输出:
$python3 test.py < test.txt
fck=83;;;fcv=naisjdf;fcv=naismc;;;;;;;fck=83;;;fmd=1422811694,;fmd=1422811694;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1423134370;;;;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1422292546;;;;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1421774352;;;;;;;;;
fck=83;;;;;;fcv=decoccm;;;;;fck=83;;;;;;fmd=1422853444;;;;
fck=83;;fcv=voyapro;;;;;;;;;fck=83;;fmd=1422270462;;;;;;;;
fck=83;fcv=demelog;fcv=voyapro;;;;;;;;;fck=83;fmd=1422183999,;fmd=1422206234,;;;;;;;;
笔记:
>我依赖行中的第一个元素(示例中的fck = 83)作为将fcv与fmds分开的条目.如果没有,这件事情会变得更加复杂.
>鉴于列表推导中foo中的重复if条,根据每行的长度,这可能非常慢.
关于out_row = [条目如果在row_fcv中输入”,则在word_list_fck中输入’:
>考虑csv.reader解析到列表时所需输出的样子(例如,第二行):[“fck = 83”,“fcv = demelog”,“”,“”,“”, “”,“”,“”,“”,“”,“”,“”,“fck = 83”,“fmd = 1423134370”,“”,“”,“”,“”,“”,“”,“ ,“”,“”,“”] – 所有空条目都变为空字符串.
>输出应该包含每个fcv的空条目,这些条目没有出现在输入中.
>因此,当使用csv.writer构建这样的列表以进行写出时,我对所有未出现在row_fcv中的fcv条目使用空字符串(如果在row_fcv中输入其他”).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。