我想将每个逗号替换为两个特定字符串(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 = somethingMQ / g'
提前致谢
答案 0 :(得分: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
答案 1 :(得分: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
答案 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
或者您可以使用:
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
答案 3 :(得分: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