Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash AWK:按从列中获得的结果的排序顺序打印文件的数据_Bash_Sorting_Unix_Awk_Logic - Fatal编程技术网

Bash AWK:按从列中获得的结果的排序顺序打印文件的数据

Bash AWK:按从列中获得的结果的排序顺序打印文件的数据,bash,sorting,unix,awk,logic,Bash,Sorting,Unix,Awk,Logic,我有一个类似以下内容的输入文件: PlayerId,Name,Score1,Score2 1,A,40,20 2,B,30,10 3,C,25,28 我想编写一个awk命令,检查得分总和大于50的玩家,并按总得分的顺序输出PlayerId和PlayerName 当我尝试以下方法时: awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k5 它不起作用,并且似乎根据它们的ID对它们进行排序 1 A

我有一个类似以下内容的输入文件:

PlayerId,Name,Score1,Score2
1,A,40,20
2,B,30,10
3,C,25,28
我想编写一个awk命令,检查得分总和大于50的玩家,并按总得分的顺序输出PlayerId和PlayerName

当我尝试以下方法时:

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k5
它不起作用,并且似乎根据它们的ID对它们进行排序

1 A
3 C
而我期望的正确输出是:因为玩家A的分数之和=60,而C的分数之和=53,我们希望输出按升序排序

3 C
1 A
除此之外,让我有点困惑的是,当我试图根据分数1(即第3列)对其进行排序,但打算只打印相应的ID和名称时,它也不起作用

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k3
和产出:

1 A
3 C
但是如果打印中包含与数据排序相关的3美元

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50)print $1,$2,$3}' | sort -k3
它生成正确的输出,但在显示中包含不需要的score1参数

3 C 25
1 A 40
但是如果只想打印id和name字段呢


实际上,我是awk命令的新手,可能我没有正确使用sort命令。如果有人能解释一下,这将非常有帮助。

如果您将排序外包,您需要有辅助值,并且需要在以后将其删除,一些复杂的问题是由于保留了标题

 $ awk -F, 'NR==1 {print s "\t" $1 FS $2; next}
     (s=$3+$4)>50 {print s "\t" $1 FS $2 | "sort -n" }' file | cut -f2

PlayerId,Name
3,C
1,A

如果您将排序外包,则需要具有辅助值,并且需要在以后将其删除,因为保留标题会带来一些复杂性

 $ awk -F, 'NR==1 {print s "\t" $1 FS $2; next}
     (s=$3+$4)>50 {print s "\t" $1 FS $2 | "sort -n" }' file | cut -f2

PlayerId,Name
3,C
1,A

我想这就是你想要做的:

$ awk 'BEGIN{FS=","} {sum=$3+$4} sum>50{print sum,$1,$2}' file |
    sort -k1,1n | cut -d' ' -f2-
3 C
1 A
您必须打印总和,以便按其排序,然后切割将其删除

如果您也想要标题输出,那么它应该是:

$ awk 'BEGIN{FS=","} {sum=$3+$4} (NR==1) || (sum>50){print (NR>1),sum,$1,$2}' file |
    sort -k1,2n | cut -d' ' -f3-
PlayerId Name
3 C
1 A

我想这就是你想要做的:

$ awk 'BEGIN{FS=","} {sum=$3+$4} sum>50{print sum,$1,$2}' file |
    sort -k1,1n | cut -d' ' -f2-
3 C
1 A
您必须打印总和,以便按其排序,然后切割将其删除

如果您也想要标题输出,那么它应该是:

$ awk 'BEGIN{FS=","} {sum=$3+$4} (NR==1) || (sum>50){print (NR>1),sum,$1,$2}' file |
    sort -k1,2n | cut -d' ' -f3-
PlayerId Name
3 C
1 A

欢迎来到SO,请在您的问题中发布准确的样本输出,然后让我们知道。顺便说一句,特别感谢您在问题中以代码的形式添加您的努力。您的第一个命令是打印2个字段打印$1、$2,并要求排序在第5个字段排序-k5上排序。您的awk脚本为第5个字段分配了一个值,但您没有打印它。是的,@EdMorton,那么这是否意味着在awk中,每当我们对字段进行排序时,它必须包含在打印语句中?…但是如果我不打算打印该字段呢?您混合了两种完全不同的工具-awk和shell。shell调用awk,然后该shell对awk的输出调用sort。要对字段进行排序,该字段必须存在于其输入中。鉴于此,awk必须输出一个字段进行排序。如果您不想在最终输出中看到该字段,则需要在完成排序后再次删除该字段。使用该字段,可以将排序输出管道化到其他工具(如cut或sed)或第二次调用awk。欢迎访问SO,请在问题中发布准确的样本输出,然后让我们知道。顺便说一句,特别感谢您在问题中以代码的形式添加您的努力。您的第一个命令是打印2个字段打印$1、$2,并要求排序在第5个字段排序-k5上排序。您的awk脚本为第5个字段分配了一个值,但您没有打印它。是的,@EdMorton,那么这是否意味着在awk中,每当我们对字段进行排序时,它必须包含在打印语句中?…但是如果我不打算打印该字段呢?您混合了两种完全不同的工具-awk和shell。shell调用awk,然后该shell对awk的输出调用sort。要对字段进行排序,该字段必须存在于其输入中。鉴于此,awk必须输出一个字段进行排序。如果您不想在最终输出中看到该字段,则需要在完成排序后再次删除该字段,方法是使用管道将排序输出传输到其他工具(如cut或sed)或第二次调用awk。非常感谢@Ed Morton…只有一个问题,当我们说sort-n时,我知道我们要进行数字排序,所以,每当我们不使用-k5或-k3或其他什么来指定字段号时,就意味着我们在按数字变量sum排序。。。是这样吗?不完全是这样,默认情况下,排序是从行的第一个字符开始按整行排序的。在本例中-n只是表示对线进行数字排序,因为第一个字段是我们关心的数字,所以这就足够了。我更新了我的答案,只按第一个字段排序,它更干净。非常感谢@Ed Morton…只有一个问题,当我们说sort-n时,我知道我们要进行数字排序,所以当我们不使用-k5或-k3或其他什么来指定字段编号时,就意味着我们在这种情况下是按数字变量sum排序。。。是这样吗?不完全是这样,默认情况下,排序是从行的第一个字符开始按整行排序的。在本例中-n只是表示对线进行数字排序,因为第一个字段是我们关心的数字,所以这就足够了。我更新了我的 回答只按第一个字段排序,它更干净。