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

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

글쎄, 어떻게 해야할지 모르겠어요.

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 

grepforin 루프와 의 조합을 통해 올바른 필드를 분리 할 수 있지만 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

관련 정보