我有一个名字和分数列表(第一,最后,得分)
我试图仅打印出以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
已经可以使用,但是我正在寻找便宜一些的东西。
答案 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