단어 검색 후 추가 문자를 추가하는 방법

단어 검색 후 추가 문자를 추가하는 방법

다음과 같은 필드 이름이 있습니다

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

Python이나 awk 및 sed로 수행하는 방법을 모르더라도 awk, sed 또는 Python으로 수행하고 싶습니다.

demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm어쩌면 별도의 파일에 추가한 다음 색인을 사용하여 검색할 수도 있습니다 . 문자열이 여기에 있으면 아무 것도 하지 않습니다. 여기에 존재하지 않으면 추가 열을 추가하겠습니다.

기술적으로 어디로 가야할지 혼란스럽고 머리를 뽑기 시작하면 어떤 도움이라도 환영합니다.

고쳐 쓰다

파이썬에서의 나의 시도는 다음과 같습니다

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예제의 경우)를 s fcvfmds 를 구분하는 항목으로 사용합니다. 그렇지 않다면 문제는 더욱 복잡해질 것입니다.
  • List Comprehension의 반복을 고려하면 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사용하여 작성하기 위한 목록을 작성할 때fcvrow_fcvif entry in row_fcv else ''

관련 정보