알겠습니다. 이 작업을 수행하는 방법을 알 수 없습니다.
나는 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