awk - OFS 问题和排序在 Bash 中协同工作

标签 awk

给定这种类型的输入:

1,Name1,Type1,100,50
2,Name2,Type2,85,80
3,Name3,Type3,95,92
4,Name4,Type4,60,55
5,Name5,Type5,87,77

我想计算最后两个值的平均值,然后按降序对它们进行排序,所以我写了这段 bash 代码:

awk 'BEGIN{FS=","} {avg=($4+$5)/2;print $1,$3,avg}' | sort -k3 -nr 

这给了我这个非常接近我预期输出的输出:

3 Type3 93.5
2 Type2 82.5
5 Type5 82
1 Type1 75
4 Type4 57.5

我想要的最后一件事是用 | 分隔输出(管道),所以我像这样使用变量 OFS:

awk 'BEGIN{FS=",";OFS="|"} {avg=($4+$5)/2;print $1,$3,avg}' | sort -k3 -nr

输出结果:

5|Type5|82
4|Type4|57.5
3|Type3|93.5
2|Type2|82.5
1|Type1|75

OFS 似乎打破了这种排序。这种行为是预期的吗?有什么解决方法吗?

最佳答案

您显示的代码尝试中存在 2 个问题。首先是 Input_file name 未在 awk 代码中传递(可能是拼写错误),第二是您需要使用 -t'|'< 在 sort 中设置分隔符 选项,所以它会像:

awk 'BEGIN{FS=",";OFS="|"} {avg=($4+$5)/2;print $1,$3,avg}' Input_file | sort -t'|' -k3 -nr
3|Type3|93.5
2|Type2|82.5
5|Type5|82
1|Type1|75
4|Type4|57.5

或者在非单行代码形式中 + 删除 avg 变量,您可以在打印自身期间获得列的平均值(如果您进一步使用 avg 变量在程序中的任何地方然后你可以创建它):

awk '
BEGIN{
  FS=","
  OFS="|"
}
{
  print $1,$3,($4 + $5)/2
}' Input_file | 
sort -t'|' -k3 -nr

来自 man sort 页面:

-t, --field-separator=SEP use SEP instead of non-blank to blank transition

关于awk - OFS 问题和排序在 Bash 中协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64389737/

相关文章:

linux - 检查参数的具体值,如果不匹配则更改它

regex - 使用sed或awk删除两个模式(不包括模式)之间的所有行

linux - awk unix 插入文件位置目录

python - 在 100 GB 的文件中搜索字符串

linux - AWK 计数 - 奇怪的行为

bash - 匹配模式后添加行

linux - 如何消除文件中 int 值之间的差距?

regex - 替换文本文件中的换行符和变量

python - 空白的多行自动递增编号

regex - 如何从 linux 中的文件的每一行中删除与模式匹配的重复单词