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

我在 DP 和 MQ 之前和之后有可变数量的字段,所以我认为 sed 是最好的。我不想在 DP 之前或 MQ 之后替换逗号。你们中的任何人都可以帮助我吗?我知道它应该看起来像这样

sed 's/DP=. ,. ,. ,. ,MQ/DP=某事MQ/g'

提前致谢

4

4 回答 4

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     
于 2013-02-05T06:57:04.900 回答
0

使用 awk ,您可以这样做(前提是没有更多 = 那里)

awk -F"=" '{gsub(",",";",$2); $1 = $1; print $1"="$2"="$3}' temp.txt

输出

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

于 2013-02-05T07:11:35.580 回答
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

或者您可以使用:

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'

测试:

> 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
于 2013-02-05T07:03:01.543 回答
0

如果您有gnu sed:这应该适用于您的示例:

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
于 2013-02-04T23:07:25.357 回答