텍스트 필드를 다른 파일의 값으로 대체

텍스트 필드를 다른 파일의 값으로 대체

알겠습니다. 이 작업을 수행하는 방법을 알 수 없습니다.

나는 fileA다음과 같은 것을 가지고 있습니다 :

([7]RIMS_ID)                                            : "CNR"       
(refGain_A[7])                                          : 1           
(RIMSclockBias_A[7])                                    : -398015316.7
(RIMSclockDrift_A[7])                                   : -6442.29    
(RIMSclockSigma_A[7])                                   : .01         
(RIMSclockSigY_A[7])                                    : 0        

([8]RIMS_ID)                                            : "ABS"       
(refGain_A[8])                                          : 1           
(RIMSclockBias_A[8])                                    : -374515458
(RIMSclockDrift_A[8])                                   : -6442.29    
(RIMSclockSigma_A[8])                                   : .01         
(RIMSclockSigY_A[8])                                    : 0     

[index]는 0에서 71까지이며 각 스테이션은 서로 다른 ID를 갖습니다.

각 스테이션의 문자열에 해당하는 값을 다음과 같이 RIMSclockBias_A다른 스테이션에 있는 값으로 바꾸고 싶습니다 .fileB

CNR -44163754.49
ABS 3417370.112
...

그래서 가지고 싶은 것 :

([7]RIMS_ID)                                            : "CNR"       
(refGain_A[7])                                          : 1           
(RIMSclockBias_A[7])                                    : -44163754.49
(RIMSclockDrift_A[7])                                   : -6442.29    
(RIMSclockSigma_A[7])                                   : .01         
(RIMSclockSigY_A[7])                                    : 0        

([8]RIMS_ID)                                            : "ABS"       
(refGain_A[8])                                          : 1           
(RIMSclockBias_A[8])                                    : 3417370.112
(RIMSclockDrift_A[8])                                   : -6442.29    
(RIMSclockSigma_A[8])                                   : .01         
(RIMSclockSigY_A[8])                                    : 0 

grep루프 for와 의 조합을 사용하여 올바른 필드를 분리할 수 있지만 awk파일 자체의 값을 어떻게 바꿀 수 있는지 모르겠습니다. sed입력으로 대체하려는 정확한 값을 알아야 하므로 실행 가능하지 않습니다.

어떤 아이디어?

답변1

이는 다음과 밀접한 관련이 있습니다.다른 질문clockBias이 경우에만 패턴 다음에 일치하는 첫 번째 줄에서 대체가 이루어져야 합니다 . 특수 문자가 없으면 fileB다음을 실행할 수 있습니다 gnu sed.

sed -E 's|(.*)[[:blank:]](.*)|/\1/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\\1\2/}}|' fileB | sed -Ef - fileA

fileB이는 단순히 다음과 같은 명령 으로 줄을 바꿉니다 sed.

/CNR/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\1-44163754.49/}}

그런 다음 두 번째 sed프로세스 에 전달하여 처리합니다 fileA.


알 수 없는 입력의 경우 특수 문자를 이스케이프 처리해야 합니다.왼쪽/오른쪽다른 질문에 대한 답변에서 설명했듯이(이번에는브레통사론):

sed 's|\(.*\)[[:blank:]]\{1,\}\(.*\)|\1\
\2|
h
s|.*\n||
s|[\&/]|\\&|g
x
s|\n.*||
s|[[\.*^$/]|\\&|g
G
s|\(.*\)\n\(.*\)|/\1/,/clockBias/{/clockBias/{s/\\(:[[:blank:]]\\{1,\\}\\)\\(.*\\)/\\1\2/}}|' fileB | sed -f - fileA

관련 정보