如何在单词搜索后添加额外的字符

如何在单词搜索后添加额外的字符

我有以下字段名称

demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm

下面是我的文件的示例。在第一列之前还有更多列fck=83...

 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 开始,我可以获取line 2fcv=demelog 和相关的 fmd ,或者对于第 7 行,fcv=voyapro 和 fcv=demelog以及1423134370相关的 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)

正如您所看到的,我需要两件事才能建立索引。第二件事是我需要能够按照顺序复制我对 fcv 所做的操作,并对该 fmd=timestamp行放置相同的顺序。

答案1

这是我使用 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在示例情况下)作为分隔 sfcvfmds 的条目。如果不是的话,这件事将会变得更加复杂。
  • 鉴于列表推导式中的重复if bar in foo,这可能会非常慢,具体取决于每行的长度。

关于out_row = [entry if entry in row_fcv else '' for entry in word_list_fck]

  • csv.reader考虑一下当解析为列表时所需的输出是什么样子的(例如,以第二行为例): ["fck=83" ,"fcv=demelog", "", "", "", "", "", "", "", "", "", "", "fck=83", "fmd=1423134370", "", "", "", "", "", "", "", "", ""]- 所有空条目都变成空字符串。
  • 输出应该包含fcv输入中未出现的每个空条目。
  • 因此,当使用 构建这样一个用于写出的列表时csv.writer,我对( )fcv中未出现的所有条目使用空字符串。row_fcvif entry in row_fcv else ''

相关内容