gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:07:47 26 4
gpt4 key购买 nike

给定这种类型的输入:

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=SEPuse SEP instead of non-blank to blank transition

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com