编辑:

编辑:

我的文件有 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 就可以完成这件事

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

相关内容