編集する:

編集する:

私のファイルには6行があります。ファイルから特定の行の平均を取得するだけで、他の行はそのまま残す必要があります。他の線はそのままにしてA1とA2、B1とB2の平均を計算する必要があります。n合計複数の列があります。

入力する:

A1  1   1   2
A2  5   6   1   
A3  1   1   1   
B1  10  12  12
B2  10  12  10
B3  100 200 300

出力:

A1A2  3    3.5   1.5     
A3    1    1     1
B1B2  10   12    11    
B3    100  200   300

スクリプトは次のとおりです。ただし、出力はタブ区切りではありません。タブで区切るにはどうすればよいですか?

$ cat tst.awk
$1 ~ /^[AB]1$/ { for (i=2;i<=NF;i++) val[$1,i]=$i; next }
$1 ~ /^[AB]2$/ { p=$1; sub(2,1,p); $1=p $1; for (i=2;i<=NF;i++) $i=($i + val[p,i])/2 }
{ print }

$ awk -f tst.awk file | column -t
A1A2  3    3.5  1.5
A3    1    1    1
B1B2  10   12   11
B3    100  200  300

答え1

BEGIN { OFS="\t" }awkスクリプト{ print }の先頭にを追加して変更する{print $1, $2, $3, $4}と、awkの出力フィールド区切り文字がデフォルトのスペースからタブに変わります。

編集する:

n列の場合は代わりに{$1 = $1; print}使用できます{print}。これが内部的にどのように機能するのかわかりませんが、テストしてみました。

答え2

awkがもう1つある場合は、これを実行できます。

awk -f tst.awk file | column -t | awk -v OFS='\t' '{ print $1,$2,$3,$4 }'

関連情報