Bash

如何在單詞搜尋後添加額外的字元

  • February 15, 2015

我有以下欄位名稱

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 和相關 fmd1423134370或第 7 行 fcv=voyapro 和 fcv=demelog 以及相關 fmdfmd=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該行中放置相同的順序。

這是我使用 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,;;;;;;;;

筆記:

  • 我依賴行中的第一個元素(在範例中)作為將s 與sfck=83分開的條目。如果沒有,這件事將變得更加複雜。fcv``fmd
  • 鑑於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_fcv``if entry in row_fcv else ''

引用自:https://unix.stackexchange.com/questions/184276