2015-01-10 3 views
-1

문자열이 "proto"이고 384 번 반복되는 파일이 있습니다. 각 "proto"은 다른 텍스트 파일에있는 384 개의 다른 레이블에 따라 편집해야합니다. 내재적으로, 두 번째 텍스트 파일의 내용이 a, sp, .. (각 레이블이 개행 문자에 있음)이면 텍스트 파일에서 첫 번째 "proto"는 "a"으로, 두 번째 텍스트는 "sp"으로 변경해야합니다. 어떻게해야합니까? 당신이 볼 그래서, 내가 "proto"의 한 형태가 a, ap, k12, sp, ... : 원본 파일의 384 반복이다 :패턴 배열에 따라 특정 패턴을 편집하는 방법은 무엇입니까?

~o <VecSize> 39 <MFCC_0_D_A> 
~h "proto" 
<BeginHMM> 
    <NumStates> 5 
    <State> 2 
     <Mean> 39 
      0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
     <Variance> 39 
      1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
    <State> 3 
     <Mean> 39 
      0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
     <Variance> 39 
      1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
    <State> 4 
     <Mean> 39 
      0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
     <Variance> 39 
      1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
    <TransP> 5 
     0.0 1.0 0.0 0.0 0.0 
     0.0 0.6 0.4 0.0 0.0 
     0.0 0.0 0.6 0.4 0.0 
     0.0 0.0 0.0 0.7 0.3 
     0.0 0.0 0.0 0.0 0.0 
<EndHMM> 

과 두 번째 파일은 다음과 같은 384 개 레이블을 포함하고 있습니다. 나는 그것이 지금 분명하기를 바란다.

awk 'FNR==NR{a[++i]=$0; next} /proto/{sub(/proto/, a[++j])} 1' replacement.txt file.txt 
+2

"패턴"이라는 단어는 매우 모호합니다 (문자열 또는 regexp 또는 ...를 의미 할 수 있음). 따라서 소프트웨어 컨텍스트에서 절대 사용하지 마십시오. 'proto'라는 이름의 문자열을 다른 문자열로 바꾸려고하는 것 같습니다. 만약'protozoan '이 입력 파일에 있다면'proto' 부분을 대체 할 것인가? 몇 가지 샘플 입력과 예상 출력을 게시하고 대체하려는 것이 대체하기는 쉽지만 대체하지 않으려는 문자열을 대체하지 않으려면 훨씬 어렵습니다. –

+0

안녕하세요 에드, 시간을내어 주셔서 감사합니다, 나는 단지 "ptroto"로 문자열을 가지고, 어떤 combinational 형태가 아닙니다. 파일이 상당히 크고 여기에 첨부 할 수 있는지 여부는 알 수 없습니다. – KianStar

+0

절대 여기에 연결하지 마십시오. 도구가 제대로 작동하지 않을 경우를 포함하는 작은 대표 입력 샘플 세트 (10-15 줄 정도)를 게시하십시오. –

답변

1

이 awk 명령을 사용하여 대체 패턴과 정확히 384 선이 TEXTFILE 가정 replacementFile에서 모든 대체 작업을 수행하고 textFile을 메모리로 빼앗긴 sed 스크립트로이 명령 세트를 읽습니다.

N.B. 이것은 textFile의 모든 패턴을 대체한다고 가정합니다.

+0

@KianStar 나는 샘플 입력과 예상 출력을 게시하지 않고 답을 선택했다. 이 말은 아무도 당신이 정말로 필요로하는 것을 생각할 기회가 없다는 것을 의미합니다. 당신이 철저하게 생각하고 테스트 한 결과, 그리고 원하지 않는 결과를 만들어 낼 수있는 다양한 방법이 있기를 바랍니다 (예 : 앰퍼샌드'&'문자가 'replacement.txt' 또는'proto'가'file.txt'에서 한 줄에 두 번 나타나는 경우 등등)는 실제 파일에서 발생할 수 없습니다. 특정 입력 세트에서 원하는 출력을 생성하는 스크립트는 솔루션의 출발점 일뿐입니다. –

+0

@KianStar 명확하게 말하자면, 이것은 완벽하게 좋은 대답은 아니지만 지금까지 샘플 입력/출력을 제공하지 않았기 때문에 질문이 무엇인지 모릅니다. 일반적으로 당신을 위해 작동하지 않습니다 그리고 만약 당신이주의 사항을 사용하여 그것을 깨닫게됩니다. –

+1

안녕하십니까, 늦게 답변 드려 죄송합니다. 귀하의 솔루션이 완벽하게 작동했습니다. 고맙습니다! – KianStar

0

이 당신 (GNU이 나오지도)을 위해 일 수 있습니다 :이에 대한 대체 명령을 생성

sed 's|.*|s/proto/&/|' replacementFile | sed -e ':a;$!{N;ba}' -f - textFile 

관련 문제