2

次のようなタブ区切りファイルがあります。

CHROM <TAB> POS <TAB> AD0062-C <TAB> AD0063-C <TAB> AD0065-C <TAB> AD0074-C 
2L <TAB> 440 <TAB>0/1:63:60,0,249 <TAB>0/1:89:86,0,166 <TAB>1/1:96:107,24,0<TAB>1/1:49:42,6,0  
2L <TAB> 260<TAB>0/1:66:63,0,207<TAB> 1/1:99:227,111,0<TAB>1/1:99:255,144,0<TAB> 1/1:49:42,6,0
2L <TAB> 595 <TAB> 0/1:11:85,0,8 <TAB>0/1:13:132,0,10 <TAB>0/1:73:70,0,131<TAB> 0/1:59:72,0,56

次のような出力を取得できるように、列3から始まる最初の3文字のみを選択したいと思います。

CHROM <TAB> POS <TAB> AD0062-C <TAB> AD0063-C <TAB> AD0065-C <TAB> AD0074-C 
2L <TAB> 440 <TAB> 0/1 <TAB> 0/1 <TAB> 1/1 <TAB> 1/1  
2L <TAB> 260 <TAB> 0/1 <TAB> 1/1 <TAB> 1/1 <TAB> 1/1
2L <TAB> 595 <TAB> 0/1 <TAB> 0/1 <TAB> 0/1 <TAB> 0/1

ありがとう

4

3 に答える 3

2

を使用してawkいます。最初の行を除くすべての行で、2 つ以上のフィールドがある場合は、それらの部分文字列を取得します。print条件がないので、行ごとのコマンドです。

awk '
    BEGIN { OFS = "\t" }
    NF > 2 && FNR > 1 { 
        for ( i=3; i<=NF; i++ ) { 
            $i = substr( $i, 1, 3 ) 
        } 
    } 
    { print }
' infile

出力:

CHROM   POS     AD0062-C        AD0063-C        AD0065-C        AD0074-C 
2L      440     0/1     0/1     1/1     1/1
2L      260     0/1     1/1     1/1     1/1
2L      595     0/1     0/1     0/1     0/1
于 2012-07-02T14:55:42.940 に答える
0

を使用した片道GNU sed。2 行目から最後の行まで、タブ間のすべての文字を先頭の最初の 3 つに置き換え、各行で何度も実行しますが、2 番目の一致からのみ行います (最初の 2 つのフィールドを避けます)。

sed '2,$ s/\([\t]...\)[^\t]*/\1/2g' infile

出力:

CHROM   POS     AD0062-C        AD0063-C        AD0065-C        AD0074-C 
2L      440     0/1     0/1     1/1     1/1
2L      260     0/1     1/1     1/1     1/1
2L      595     0/1     0/1     0/1     0/1
于 2012-07-02T15:08:27.103 に答える
0

これはうまくいくかもしれません(GNU sed):

sed '1b;s/\(\S\{3\}\)\S*/\1/2g' file
于 2012-07-02T18:27:34.897 に答える