熱操作にAWKを使用する

熱操作にAWKを使用する

200を超える列を含むファイルがあります。たとえば、ここでは列数が少ないファイル(9)を使用しています。以下は入力ファイルです(数行)。

chr10   181243  225933  1   1   1   10  0   36
chr10   181500  225933  1   1   1   106 0   35
chr10   226069  255828  1   1   1   57  0   37
chr10   243946  255828  1   1   1   4   0   27
chr10   255989  267134  1   1   1   87  0   32
chr10   255989  282777  1   1   1   61  0   34
chr10   267297  282777  1   1   1   61  0   37
chr10   282856  283524  1   1   1   92  0   35
chr10   282856  285377  1   1   1   1   0   15
chr10   283618  285377  1   1   1   72  0   33

最後の列(ここでは列9)が出力ファイルの列4になるようにファイルを並べ替えてから、他のすべての項目を印刷したいと思います。だから私が探している結果は次のとおりです。

chr10   181243  225933  36  1   1   1   10  0
chr10   181500  225933  35  1   1   1   106 0
chr10   226069  255828  37  1   1   1   57  0
chr10   243946  255828  27  1   1   1   4   0
chr10   255989  267134  32  1   1   1   87  0
chr10   255989  282777  34  1   1   1   61  0
chr10   267297  282777  37  1   1   1   61  0
chr10   282856  283524  35  1   1   1   92  0
chr10   282856  285377  15  1   1   1   1   0
chr10   283618  285377  33  1   1   1   72  0

列数が少ないファイルでは、次の方法を使用して上記の出力を取得できます。

awk -v OFS="\t" '{print $1,$2,$3,$9,$4,$5,$6,$7,$8}'

これで、列数が多いファイルがある場合は、ファイルの最後の列を4番目の列にし、残りをそのまま印刷するにはどうすればよいですか?

答え1

Perlはこれについてとてもきれいです。各行を単語に分割し、最後の単語をポップしてインデックス3(0から始まる)に挿入します。

$ perl -lane 'splice @F, 3, 0, pop(@F); print "@F"' file | column -t
chr10  181243  225933  36  1  1  1  10   0
chr10  181500  225933  35  1  1  1  106  0
...

答え2

4番目のフィールドを最後のフィールドに置き換えるには:

awk -v OFS="\t" '{ $4 = $NF; $NF=""; print }

最後のフィールドを挿入今後4番目のフィールドでは、いくつかの創造性を発揮する必要があります。

awk -v OFS="\t" '{temp=$NF; for( i=NF;i>4;i-- ) {$i=$(i-1)}; $4=temp  ; print}'

これにより、最後のフィールドが保持され、すべてのフィールドが繰り返され、各フィールドが後ろの4番目のフィールドの前に移動され、4番目のフィールドが所定の位置に配置されます。

$ echo {1..10} | awk -v OFS="\t" '{temp=$NF; for( i=NF;i>4;i-- ) {$i=$(i-1)}; $4=temp  ; print}'
1   2   3   10  4   5   6   7   8   9

関連情報