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