打印和排序输出的替代方法

时间:2019-07-18 13:51:36

标签: linux bash awk

我有一个名字和分数列表(第一,最后,得分)

我试图仅打印出以DESCENDING NUMERICAL顺序出现的姓氏。

这是一个示例列表。

inisha__Ohler__1
Loralee__Hippe__5
Boyd__Leslie__8
Donnette__Cosentino__5
Viva__Bedsole__4
Jann__Banfield__3
Alan__Dionne__2
Sandee__Verdun__2
Raeann__Sweetman__3
Judson__Goers__2
Mandie__Salcedo__8
Yesenia__Bibeau__1
Doug__Petteway__9
Alejandra__Winter__9
Marquitta__Sang__7
Rusty__Rodrigue__2
Rickie__Devin__1
Marie__Elem__3
Faustina__Haltom__4
Dorthea__Ervin__4
Yesenia__Bibeau__5
Doug__Petteway__8
Alejandra__Winter__1
Marquitta__Sang__9
Rusty__Rodrigue__4
Yesenia__Bibeau__2
Doug__Petteway__4
Alejandra__Winter__3
Marquitta__Sang__6
Rusty__Rodrigue__6
Rickie__Devin__7
Marie__Elem__1
Faustina__Haltom__2
Dorthea__Ervin__4

我想使用单个“ |”吐出输出或更少。

cut -d "_" -f 3 scores | sort -r | uniq -c | sort -nr

已经可以使用,但是我正在寻找便宜一些的东西。

3 个答案:

答案 0 :(得分:1)

我相信实现这一目标的最便宜的方法是使用awk,其排序如下:

awk -F"__" '{ count[$2]++ } END {for (word in count) print count[word], word}' < scores | sort -r

,以防万一您还想像uniq -c为您提供开头的那三个空格,

awk -F"__" '{ count[$2]++ } END {for (word in count) print "  ", count[word], word}' < scores | sort -r

答案 1 :(得分:0)

GNU awk特定:

$ gawk -F__ '{ names[$2]++ }
             END { PROCINFO["sorted_in"] = "@val_num_desc";
                   for (n in names) { print n }
             }' input.txt
Sang
etc.

答案 2 :(得分:0)

使用此perl单线版

perl -aF/__/ -ne '$h{$F[1]}++; END{ print"$$_[0]\t$$_[1]\n" for sort {$$b[0]<=>$$a[0]} map {[$h{$_},$_]} keys %h }' <scores

或仅显示最常出现的名称

perl -MList::Util=max -aF/__/ -ne '$h{$F[1]}++; END{ $max=max(values%h); print "$h{$_}\t$_\n" for grep {$h{$_}==$max} keys%h }' <scores