微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有以下字段名称

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开始,我可以获得第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] 举报,一经查实,本站将立刻删除。

相关推荐