문자 앞에 공백 문자 삽입

문자 앞에 공백 문자 삽입

다음과 같은 파일이 있습니다.

120E+00 360E+01 258E-09-784E+02  
-847E+00-360E+01 242E-08 420E+05  
14E+00 360E+01 254E+00 78E+02  
-120E+00-254E-01-223E-09-786E-02  

E+00, E+01, E-01 등은 과학적 표기법을 사용하여 ^0, ^1, ^-1 등을 나타냅니다.

다음 형식의 파일을 얻고 싶습니다.

120E+00 360E+01 258E-09 -784E+02  
-847E+00 -360E+01 242E-08 420E+05  
14E+00 360E+01 254E+00 78E+02  
-120E+00 -254E-01 -223E-09 -786E-02  

과학적 표기법이나 음수 자체를 수정하지 않고 음수 앞에 공백을 추가하고 싶습니다.
또한 음수가 행의 첫 번째(첫 번째 열)인 경우, 2열부터 행 끝까지 공백을 추가하고 싶지 않습니다.
저도 awk를 사용하고 싶습니다.

내 설명이 명확하기를 바랍니다.
감사합니다!

답변1

-따라서 기본적으로 바로 앞의 문자가 -숫자인 경우 각 문자 앞에 공백을 추가해야 합니다. 그렇게 할 수도 있지만 awk여기서는 실제로 좋은 선택이 아닙니다. 이렇게 하는 것이 훨씬 간단합니다 sed.

$ sed -E 's/([0-9])-/\1 -/g' file
120E+00 360E+01 258E-09 -784E+02  
-847E+00 -360E+01 242E-08 420E+05  
14E+00 360E+01 254E+00 78E+02  
-120E+00 -254E-01 -223E-09 -786E-02  

또는 펄:

$ perl -pe 's/([0-9])-/\1 -/g' file
120E+00 360E+01 258E-09 -784E+02  
-847E+00 -360E+01 242E-08 420E+05  
14E+00 360E+01 254E+00 78E+02  
-120E+00 -254E-01 -223E-09 -786E-02 

위의 두 가지 모두에 대해 -i원본 파일을 인쇄하는 대신 수정하려면 다음을 추가하세요.

sed -i -E 's/([0-9])-/\1 -/g' file
perl -i -pe 's/([0-9])-/\1 -/g' file

awkmawk다음은 최신 버전의 GNU 및 기타 지원되는 버전 awk에서 이를 수행하는 방법 입니다 gensub.에드 모튼지금은 삭제된 댓글에서 이 내용을 제공한 사람:

awk '{print gensub(/([0-9])-/,"\\1 -","g")}' file

GNU awk( )를 사용하면 edt raw 파일을 gawk사용할 수 있습니다 .-i inplace

gawk -i inplace '{print gensub(/([0-9])-/,"\\1 -","g")}' file

답변2

 sed -e "s/-[0-9]*E/ &/g" -e "s/^ -/-/g" file

산출

120E+00 360E+01 258E-09 -784E+02  
-847E+00 -360E+01 242E-08 420E+05  
14E+00 360E+01 254E+00 78E+02  
-120E+00 -254E-01 -223E-09 -786E-02  

답변3

이를 수행하기 위해 소위 "현대적인" awk 변형이 필요하지 않습니다.

mawk 'gsub("[0-9][-]","&"_)gsub("."_," -")\
        sub("[\t ]+$", "")_'     \_='\3\21' file0.txt           

120E+00 360E+01 258E-09 -784E+02
-847E+00 -360E+01 242E-08 420E+05
14E+00 360E+01 254E+00 78E+02
-120E+00 -254E-01 -223E-09 -786E-02

gawk, mawk-1, mawk-2 및 nawk와 함께 작동하는 것으로 확인되었습니다.

더 단순한 변형의 경우 후행 공백/탭도 수정하고 과학 표기법의 변경 사항을 고려합니다.

mawk2 'gsub("[-][0-9]*[Ee][+-]?"," &")/-(NF=NF)<!_'

관련 정보