Awk OFS和sort在Bash中协同工作的问题

Awk OFS和sort在Bash中协同工作的问题,awk,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 我想计算最后2个值的平均值,然后按降序排序,因此我编写了以下bash代码: awk 'BEGIN{FS=","} {avg=($4+$5)/2;print $1,$3,avg}' | sort -k3 -nr 这使我的输出非常接近我的预期输出: 3

鉴于这种类型的输入:

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
我想计算最后2个值的平均值,然后按降序排序,因此我编写了以下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
最后一件事是用|(pipes)分隔输出,因此我使用变量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正在打破这种局面。这种行为是预期的吗?是否有解决方法?

所示代码尝试中有两个问题。首先是输入文件名未在
awk
代码中传递(可能是打字错误),第二是您需要使用
-t'|'
选项在
排序中设置分隔符,因此类似于:

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
变量,则可以创建它):

人工分拣
页面:

-t、 --字段分隔符=SEP 使用SEP而不是非空到空转换


实际上,您还可以使用awk的打印和排序:

$ cat testfile.csv 
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

$ awk 'BEGIN{FS=",";OFS="|"}{print $1,$3,($4+$5)/2 | "sort -t \"|\" -nrk3"}' testfile.csv 
3|Type3|93.5
2|Type2|82.5
5|Type5|82
1|Type1|75
4|Type4|57.5
使用GNU awk的功能:

gawk'
开始{FS=“,”subsp=“|”}
{avg=($4+$5)/2;结果[$1,$3,avg]=avg}
结束{
PROCINFO[“排序在”]=“val\u num\u desc”
对于(结果中的行)打印行
}
'testfile.csv

subsp是保存逗号分隔数组键的联接字符串的变量。它的默认值是八进制034,即“FS”字符。

谢谢您的回答!我不知道我们必须同时使用-t选项和OFS变量。我是bash新手,找不到类似的例子online@S4rt-H4K,…此处使用的组件之间的边界(
bash
sort
awk
)非常重要
OFS
是一个awk变量;bash对它一无所知,像
sort
这样的工具是独立的可执行文件,它们甚至不能访问(非导出的)
bash
变量,更不用说访问
awk
变量了。哦,我不知道我们也可以这样使用它。谢谢你的回答
$ cat testfile.csv 
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

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