0

Linuxシェルスクリプトで条件付きでいくつかの列を置き換えたい.

マイデータは

ID         chr pos ver  
rs1234      1 12312 b1  
rs1245      1 21312 b1  
chr1:7576:D 1 22312 b1  
rs1002      1 34535 b1  
chr1:2434:D 1 34534 b1  
MER:1222    1 54645 b1  
rs2123      1 45645 b1 

最初の列が「MER」で始まるか「D」で終わる場合、3番目の列を「NA」に置き換えたいと思います。したがって、最終的なファイルは次のようになります

ID         chr pos    ver  
rs1234      1 12312   b1  
rs1245      1 21312   b1  
chr1:7576:D 1 **NA**  b1  
rs1002      1 34535   b1  
chr1:2434:D 1 **NA**  b1  
MER:1222    1 **NA**  b1  
rs2123      1 45645   b1  
4

3 に答える 3

0

perlワンライナーを使用したソリューションは次のとおりです。

perl -pe 's/^(MER:.+?|.+?:D)(\s+\d+\s+)(\d+)(.*)$/$1$2**NA**$4/' foo.txt

-i オプションを perl に追加して、元のファイルを直接変更します。

上記の例の詳細な内訳は次のとおりです。

s/match/replace/ 構文で検索および置換できます...

s/^(MER:.+?|.+?:D)(\s+\d+\s+)(\d+)(.*)$/$1$2**NA**$4/
^^                                     ^            ^

括弧は、置換で使用される一致のグループをキャプチャするために使用されます。

s/^(MER:.+?|.+?:D)(\s+\d+\s+)(\d+)(.*)$/$1$2**NA**$4/
   ^_____________^^_________^^___^^__^
         $1           $2      $3   $4

正規表現が一致する場合にのみ置換が行われるため、括弧内の最初のグループがケースの一致を決定します。MER:で始まり、またはで終わりたいので:D|記号は「または」を意味するために使用されます。

正規表現は、検索と置換を行うための強力な方法であり、多くのツールと言語でサポートされています。この構文をよりよく理解するには、オンラインでチュートリアルを見つける価値があります。

于 2013-03-02T12:41:45.590 に答える
0

awk次のようにしてこれを実現できます。

# awk '{if(NR!=1&&($1~/^MER/||$1~/D$/)){$3="N/A"} print $0}' INPUT > OUTPUT

これにより、サンプル データを使用して次の出力が得られます。

ID         chr pos ver  
rs1234      1 12312 b1  
rs1245      1 21312 b1  
chr1:7576:D 1 N/A b1
rs1002      1 34535 b1  
chr1:2434:D 1 N/A b1
MER:1222 1 N/A b1
rs2123      1 45645 b1 

書式設定を維持したい場合で、列が固定幅である場合は、printf代わりに次のステートメントを使用できます。

# awk '{if(NR!=1&&($1~/^MER/||$1~/D$/)){$3="N/A"} printf("%-As %Bs %Cs %Ds\n",$1,$2,$3,$4)}' INPUT > OUTPUT

A、B、C、および D を、目的の列幅を表す整数に置き換えます。例えば:

# awk '{if(NR!=1&&($1~/^MER/||$1~/D$/)){$3="N/A"} printf("%-11s  %1s  %5s %2s\n",$1,$2,$3,$4)}' INPUT > OUTPUT

与える:

ID          chr   pos ver
rs1234       1  12312 b1
rs1245       1  21312 b1
chr1:7576:D  1    N/A b1
rs1002       1  34535 b1
chr1:2434:D  1    N/A b1
MER:1222     1    N/A b1
rs2123       1  45645 b1
于 2013-03-02T03:15:42.797 に答える
0

これが解決策ですsed

sed -e 's/\(\(MER:[0-9]\+\|[0-9:]D\)\s\+[0-9]\+\s\+\)[0-9]\+\(.*\)/\1**NA**\3/g' INPUTFILE

生成する

ID         chr pos ver  
rs1234      1 12312 b1  
rs1245      1 21312 b1  
chr1:7576:D 1 **NA** b1  
rs1002      1 34535 b1  
chr1:2434:D 1 **NA** b1  
MER:1222    1 **NA** b1  
rs2123      1 45645 b1

しかしawk、おそらくここに行く方法です。またはパール。

于 2013-03-02T03:39:12.570 に答える