0

たまたま2つの特定の文字列(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 '

前もって感謝します

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

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 に答える
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

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 に答える