2

私は次のような行のファイルを持っています:

1       17      A       G       R:560:500:60:10.71%:1.6329E-19  Pass:1.0:276:0:57:0:1E0 15      17      0       0       R:24:20:4:16.67%:5.461E-2 R:22:20:2:9.09%:2.4419E-1 R:27:24:3:11.11%:1.1792E-1 R:26:23:3:11.54%:1.1765E-1 A:16:16:0:0%:1E0 A:23:23:0:0%:1E0 A:11:10:1:9.09%:5E-1
1       36      C       T       Y:560:499:61:10.89%:7.7026E-20  Pass:1.0:275:0:58:0:1E0 15      17      0       0       Y:24:20:4:16.67%:5.461E-2 Y:22:20:2:9.09%:2.4419E-1 Y:27:24:3:11.11%:1.1792E-1 Y:26:23:3:11.54%:1.1765E-1 C:16:16:0:0%:1E0 C:23:23:0:0%:1E0 C:11:10:1:9.09%:5E-1 

私は以前、ライナーで次のawkを使用して、各フィールドの最初の文字を$11以降から抽出していました。

awk '{n=11; while (n<18) {{$n = substr($n, 0, 1)} n++} print $0}'

これらのフィールドからパーセンテージ(フィールドの4番目のコロンの後の値)のみを抽出できるように、簡単に変更する方法を探しています。出力は次のようになります。

1       17      A       G       R:560:500:60:10.71%:1.6329E-19  Pass:1.0:276:0:57:0:1E0 15      17      0       0       16.67% 9.09% 11.11% 11.54% 0% 0% 9.09%
1       36      C       T       Y:560:499:61:10.89%:7.7026E-20  Pass:1.0:275:0:58:0:1E0 15      17      0       0       16.67% 9.09% 11.11% 11.54% 0% 0% 9.09%   

乾杯。

4

1 に答える 1

2

これにより、「%」を含むパーセンテージが出力されます。

split($5, arr, ":"); print arr[5]

split()データに合わせてステートメントのフィールド番号を調整します。

whileループを使用してインクリメント変数を自分で管理する必要はありませんfor。ループを使用するだけです。上記の手法とforループを使用した、完全に機能するスクリプトを次に示します。

awk 'BEGIN {OFS = "\t"} {for (n = 11; n < 18; n++) {split($n, arr, ":"); $n = arr[5]}; print $0}'

サンプル出力:

1   17  A   G   R:560:500:60:10.71%:1.6329E-19  Pass:1.0:276:0:57:0:1E0 15  17  0   0   16.67%  9.09%   11.11%  11.54%  0%  0%  9.09%
1   36  C   T   Y:560:499:61:10.89%:7.7026E-20  Pass:1.0:275:0:58:0:1E0 15  17  0   0   16.67%  9.09%   11.11%  11.54%  0%  0%  9.09%
于 2012-07-03T15:36:20.937 に答える