首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在bash中更改uniq -c自动默认的列吗?

我可以在bash中更改uniq -c自动默认的列吗?
EN

Stack Overflow用户
提问于 2017-04-04 15:41:00
回答 2查看 67关注 0票数 0

我有一个包含以下列的文件:

代码语言:javascript
复制
David Smith    Bronze
Henry Jackson  Silver
David Smith    Bronze
Angela Wright  Gold
Angela Wright  Gold
David Smith    Gold
David Smith    Bronze

我试着写了下面的代码:

代码语言:javascript
复制
awk -F ',' '{if($6 == "name") print $6, $1}' filename.csv | sort | uniq -c

我的输出是:

代码语言:javascript
复制
4   David Smith   
2   Angela Wright 
1   Henry Jackson

有没有办法颠倒列的顺序,让名字出现在第一列,他们获得的奖项数量出现在第二列?

EN

回答 2

Stack Overflow用户

发布于 2017-04-04 16:56:53

awk可以做到这一点:

代码语言:javascript
复制
awk '{a[$1FS$2]++}END{for(i in a)print i,a[i]}' file

如果希望对其进行排序,可以使用管道和排序,也可以使用awk自己的数组排序函数

票数 1
EN

Stack Overflow用户

发布于 2017-04-04 16:38:58

这里有一些想法,一个使用sed,另一个使用awk:

代码语言:javascript
复制
$ cat names.txt
David Smith
Henry Jackson
David Smith
Angela Wright
Angela Wright
David Smith
David Smith

$ uniq -c names.txt
   1 David Smith
   1 Henry Jackson
   1 David Smith
   2 Angela Wright
   2 David Smith

$ uniq -c names.txt | sed -E 's/([0-9]+) (.*$)/\2 \1/'
   David Smith 1
   Henry Jackson 1
   David Smith 1
   Angela Wright 2
   David Smith 2

$ uniq -c names.txt | awk '{count=$1; for (i=1; i<NF; ++i) $i = $(i+1); $NF=count}1'
David Smith 1
Henry Jackson 1
David Smith 1
Angela Wright 2
David Smith 2

如果你想让它更美观,你可以在名称和count之间使用非空格分隔符,并通过管道连接到列:

代码语言:javascript
复制
$ uniq -c names.txt | sed -E 's/([0-9]+) (.*$)/\2|\1/' | column -t -s \|     
David Smith    1
Henry Jackson  1
David Smith    1
Angela Wright  2
David Smith    2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43201122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档