글쎄, 어떻게 해야할지 모르겠어요.
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
in 루프와 의 조합을 통해 올바른 필드를 분리 할 수 있지만 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