2013-02-04 6 views
0

두 개의 특정 문자열 (DP & MQ) 사이의 모든 쉼표를 세미콜론으로 대체하고 싶습니다.특정 문자열 간의 대체 문자

입력

0,0,0,DP=1,1,1,1,MQ=2,2,2 

예상 출력

0,0,0,DP=1;1;1;1;MQ=2,2,2 

I 전과 그래서 최고가 될 나오지 알았는데 DP & MQ 후 필드의 가변 수있다. DP 이전이나 MQ 이후에 쉼표로 대체하고 싶지 않습니다. 여러분 중 누구라도 나를 도와주세요.이 모양이 이렇게 보일 것입니다.

sed의/DP =. .,. ., MQ/DP는 = somethingMQ/g '당신이있는 경우 사전

답변

2

이 방법이 유용 할 수 있습니다 (GNU sed) :

sed -r 's/DP.*MQ/\n&\n/;h;y/,/;/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/' file 

이 sed 관용구는 문제의 문자열을 줄 바꿈으로 표시하고, 표시된 줄을 복사하고, 문자열을 변경 한 다음 원래 줄과 변경된 문자열을 결합합니다.

문자열의 마킹은보다 구체적 일 수 있습니다.:

sed -r 's/DP=[^=]*MQ=/\n&\n/;h;y/,/;/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/' file 

전용 파일의 일부는 질문 사용되는 문자열을 포함 할 수있는 경우 : 코드 아래

sed -r '/DP=[^=]*MQ=/{s//\n&\n/;h;y/,/;/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/}' file  
+0

감사합니다 –

0

에서

감사 GNU 나오지도 :이 귀하의 예제와 함께 작동합니다 :

sed -r 's/(.*DP=)(.*)(MQ=.*)/echo -n \1;echo -n \2 \|tr "," ";"; echo -n \3/ge' input 

테스트 귀하의 예제와

kent$ sed -r 's/(.*DP=)(.*)(MQ=.*)/echo -n \1;echo -n \2 \|tr "," ";"; echo -n \3/ge' <<<"0,0,0,DP=1,1,1,1,MQ=2,2,2" 
0,0,0,DP=1;1;1;1;MQ=2,2,2 
0

할 것 :

awk -F"=" '{OFS="=";gsub(",",";",$2)}1' 

테스트 :

> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | awk -F"=" '{OFS="=";gsub(",",";",$2)}1' 
0,0,0,DP=1;1;1;1;MQ=2,2,2 

또는 다음을 사용할 수 있습니다 :

,451,515,
perl -plne '$_=~/DP=(.*)MQ/;$a=$1;$a=~s/,/;/g;$_=~s/(.*DP=).*(MQ.*$)/$1$a$2/g' 

이 테스트 :

> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | perl -plne '$_=~/DP=(.*)MQ/;$a=$1;$a=~s/,/;/g;$_=~s/(.*DP=).*(MQ.*$)/$1$a$2/g' 
0,0,0,DP=1;1;1;1;MQ=2,2,2 

또는

perl -F"=" -ane '$F[1]=~s/,/;/g;print join "=",@F' 

테스트 :

AWK와
> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | perl -F"=" -ane '$F[1]=~s/,/;/g;print join "=",@F' 
0,0,0,DP=1;1;1;1;MQ=2,2,2 
0

,이 같이 할 수

(더 이상 =이 없다 제공) 그것은 나를 위해 작동 도움을
awk -F"=" '{gsub(",",";",$2); $1 = $1; print $1"="$2"="$3}' temp.txt 

출력

0,0,0,DP=1;1;1;1;MQ=2,2,2