5

私の 4 列の出力の一部は次のようになります。

5    cc1kcc1kc    5    cc1kcc1kc
5    cc2ppggg   5    cc2ppggg
6    ccg12qqqqqqqqqqqqggg    10 ccccg11qqqqqqqqqqqggggg 
3    4qqqqcgc1q   12    cgccgccgccgc

2 番目と 4 番目の列のみを変更したいのですが、awk/sed を使用して、横にある文字の数字を削除する方法はありますか? それとも、perl スクリプトを使用してこの変換を実行する方が簡単/良いでしょうか?

結果の出力は次のようになります。

5    ccccc    5    ccccc
5    ccggg    5    ccggg
6    ccgggg   10    ccccgggggg 
3    cgc    12    cgccgccgccgc
4

4 に答える 4

4

質問を文字通りに解釈すると、これにより、フィールドに埋め込まれた任意のnについて、フィールド 2 と 4 から次のn文字が削除されます。

perl -lane 'for $i (1, 3) {@nums = $F[$i] =~ /(\d+)/g; for $num (@nums) {$F[$i] =~ s/$num.{$num}//}}; print join("\t", @F)'

他の回答は数字を削除し、それに続くすべての文字は同じです。

私の答えと他の答えの違いを説明するには、次の入力を使用します。

6    ccg8qqqqqqqqqqqqggg    10 ccccg3qqqqqqqqqqqggggg

私のバージョンはこれを出力します:

6    ccgqqqqggg     10      ccccgqqqqqqqqggggg

彼らがこれを出力している間:

6    ccgggg    10 ccccgggggg
于 2012-06-25T21:15:20.663 に答える
1

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

sed 'h;s/\S*\s*\(\S*\).*/\1/;:a;s/[^0-9]*\([0-9]\+\).*/sed "s|\1.\\{\1\\}||" <<<"&"/e;ta;H;g;/\n.*\n/bb;s/\(\S*\s*\)\{3\}\(\S*\).*/\2/;ba;:b;s/^\(\S*\s*\)\(\S*\)\([^\n]*\)\n\(\S*\)/\1\4\3/;s/\(\S*\s*\)\n\(.*\)/\2/' file
于 2012-06-27T16:59:33.697 に答える