파일에서 형식 변경 데이터. 여러 개의 sed 명령?


0

파일에서 일부 데이터의 형식을 변경하는 방법에 대한 조언을 원합니다.

파일에 많은 양의 데이터가 있습니다. 이것은 큰 포트란 프로그램의 출력이며, 라텍스 테이블 용으로 포맷되어 있습니다. 형식을 변경하고 싶지만 출력의 대체 형식으로 Fortran 프로그램을 다시 실행할 수 없습니다. 나는 sed와 놀고 있었지만 멀리 가지 못했습니다.

표의 한 줄은 현재 형식입니다.

0.1 & 0.166685D+01 & 0.162768D+01 & 0.139468D+01 & 0.126904D+01 & 0.133247D+01 \\

나는 그것을 바꾸고 싶다

0.1 & $0.16668510^{01}$ & $0.16276810^{01}$ & $0.13946810^{01}$ & $0.12690410^{01}$ & $0.133247 10^{01}$ \\

나는 현재

#!/bin/bash

sed -i 's/D\+./ 10^{/g' $1

어느 정도까지 나를 얻을 수

0.1 & 0.166685 10^{01 & 0.162768 10^{01 & 0.139468 10^{01 & 0.126904 10^{01 & 0.133247 10^{01 \\

그러나 여전히 닫는 중괄호를 추가하고 각 숫자를`$ '기호로 감싸 야합니다.

이상적인 단어로도 데이터를 3dp로 변경하지만 덜 중요합니다.

도움을 줄 수있는 모든 sed / regex 마스터 또는이 문제에 더 적합한 다른 도구를 제안 할 수 있습니다.

감사

나사 돌리개

나는이 예에서 모든 힘이 +01이라는 것을 예에서 깨달았습니다. 일부 NaN이 포함 된 또 다른 예제 라인.

0.3 & 0.634620D-02 & NaN & NaN & -0.312678D-02 & 0.192654D-03 \\

답변:


0

그리고 여기 당신의 sed 표현이 있습니다 :

sed -e 's/D+\([^ ]*\)/10^{\1}/g' -e 's/ \([^ &]*\) / $\1$ /g' -e 's/^/$/'

다음과 같이 읽습니다.

s/D+\([^ ]*\)/10^{\1}/g

... D + [공백이없는 단어]를 모두 10 ^ {[공백이없는 단어]}로 바꿉니다.}

s/ \([^ &]*\) / $\1$ /g

... [space] [공백과 문자를 포함하지 않는 단어] [space]를 [space] $ [공백과 문자를 포함하지 않는 단어]로 대체하십시오.

s/^/$/

... 그리고 앞에 $ -sign을 붙입니다.


0

다음은 2 단계로 대체를 수행하는 Perl one-liner입니다.

perl -pe ' s/D\+01/10\^{01}\$/g; s/\& /\& \$/g; ' < in.txt > out.txt

편집하다...

좋아, 변경된 요구 사항에 따라 ...

perl -pe ' 

s/ \& NaN//g;               # removes <space>&<space>NaN sequences
s/D\+/10\+/g;               # replace D+ with 10+
s/D\-/10\-/g;               # replace D- with 10- 
s/\+/\^{/g;                 # replace +  with ^{ 
s/(?<! )\-/\^{-/g;          # replace -  with ^{- if preceding char is not a <space> 
s/(?<!\.[0-9]) \&/\} \&/g;  # replace <space>& with }<space>& if preceding chars are not .<single-digit> seq. 
s/ \\/\} \\/g;              # replace <space>\ with }<space>\

' < in.txt > out.txt

이 시점부터는 적절한 스크립트를 작성해야하지만 제공 한 샘플 데이터에서 작동합니다. 그대로 복사하여 bash에 붙여 넣을 수 있습니다.


감사. 지수의 거듭 제곱이 무엇이든 될 때 그것을 바꿀 수 있습니까? 나는 단지 예를 들자 마자 그것이 변화하는 대부분의 시간이 +01이라는 것을 알았습니다.
Tommy

고마워 나는 이것을 좋아하고 그것을 펄 스크립트에 넣으려고 변경하면서 놀고 있었지만 펄에 대한 나의 제로 지식으로 인해 몇 가지 사소한 것들에 어려움이있었습니다. 나는 또 다른 시간을 보낼 것이지만 그것이 내가 알고있는 것처럼 sed solon으로 떨어졌습니다.
Tommy

perl -pe ''구문은 명령 행에서 Perl 스크립트를 단일 라이너로 실행하기위한 것입니다. 위의 내용은 in.txt를 입력으로 처리 한 후 결과를 out.txt로 출력합니다. 경로를 수정하거나 in.txt 디렉토리에서 실행해야 할 수도 있습니다. Perl을 awk / sed / grep / etc로 사용하는 방법에 대한 정보. 교체는 Tim Maher의 Minimal Perl 책을 참조하십시오.
Joe Internet

0

케이크 조각. 라텍스를 생산하는 고대 프로그램이있는 프로젝트는 언제 시작합니까? :(

$ cat tmp/latex-table 
echo '0.1 & 0.166685D+01 & 0.162768D+01 & 0.139468D+01 & 0.126904D-21 & 0.133247D+01 \\' |\
sed -e 's/&\([^0-9]*\)\([0-9\.]*\)D\([+\-]\)\([0-9]*\)/\&\1$\2 10^{0\3\4}$/g'
raptor: ~
$ bash tmp/latex-table 
0.1 & $0.166685 10^{0+01}$ & $0.162768 10^{0+01}$ & $0.139468 10^{0+01}$ & $0.126904 10^{0-21}$ & $0.133247 10^{0+01}$ \\
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.