2012-10-04 3 views
1

으로 구분 된 텍스트 파일에 빈 필드 교체 : 빈 필드를 갖는나는 형태의 데이터의 구분 세트 걸리는 프로젝트를 진행하고 더미 값

field1~field2~field3~.....~fieldn 

하기 때문에,

field1~~~field4~~field6 
가능성입니다

은 완벽하게 허용됩니다.

이 파일은 약간의 변경이 필요한 내부 번역 프로그램을 사용하여 번역됩니다. 특히 빈 필드를 제대로 처리하지 못합니다. 내 해결책은 공간이나 @ 기호처럼 더미 값을 막대기로 넣는 것이 었습니다.

sed -r 's/~/~ ~/g' 

awk '{gsub(/\~\~/,"~ ~")}; 1' file > file.SPACE 

을하지만, 여러 필드를 교체 이러한 가을의 두 짧은 : 나는 시도했습니다.

field1~field2~~~field3 

I 입력 경우에 따라서는거야 출력 :

field1~field2~ ~~field3 

내가 좋아하는 것 단지 스크립트에이 내가 번역자의 코드를 변경할 수 없기 때문에, 내가 할 수있는 경우. 구분 된 파일을 만드는 프로그램의 코드를 변경할 수는 있지만 그렇지 않을 수도 있습니다. 몇 가지 해결 방법이 있습니까, 아니면 정규 언어의 고유 한 제한 사항 중 하나에 대한 표현으로 떠오르고 있습니까?

편집 : 빠른 응답을 보내 주셔서 감사합니다. 모든 솔루션이 작동하여 모든 항목을 upvoted했습니다. 나는 이유 때문에 Janito를 받아 들일 것 같아.

왜 downvote?

답변

4

당신이 시도 할 수 :

sed -e ':a;s/~~/~ ~/;ta' 

이 레이블을 생성의 ""를 함께 ":"명령은 다음 ~ ~~~ 중 하나 개 발생에 대체 한 다음 다시 이동하려면 "t"테스트 명령을 사용하여 이전 대체 명령이 성공하면 "a"레이블에 추가하십시오. 이 = 도움이

희망)

3
awk '{for(i=0; i<=NF; i++) if($i ~ /^$/) $i = " " } 1' FS='~' OFS='~' input 

나 :

awk '/^$/{ $0 = " " } 1' ORS='~' RS='~' input 

나 :

awk '{ while(gsub("~~", "~ ~")); }1' input 
1
sed -e ':loop' -e 's/~~/~ ~/g' -e 't loop' file 
1

당신은

펄을 사용할 수 있습니다3210
perl -pe 's/~(?=~)/~ /g' 

...이는 file.SPACE 사용 결과 (들)을 저장하는 "~ "


"~""~" 다음을 대체 말한다

perl -pe 's/~(?=~)/~ /g' file >file.SPACE 
관련 문제