45

有这个文本文件:

name, age
joe,42
jim,20
bob,15
mike,24
mike,15
mike,54
bob,21

试图得到这个(计数):

joe 1
jim 1
bob 2
mike 3

谢谢,

4

6 回答 6

105
$ awk -F, 'NR>1{arr[$1]++}END{for (a in arr) print a, arr[a]}' file.txt
joe 1
jim 1
mike 3
bob 2

解释

  • -F,分裂,
  • NR>1处理第 1 行之后的行
  • arr[$1]++以第一列为键递增数组arr(用 拆分),
  • END{}块在处理文件结束时执行
  • for (a in arr)arrakey迭代
  • print a用键打印键, arr[a]数组a
于 2013-02-17T00:50:24.927 回答
28

剥离标题行,删除年龄字段,将相同的名称组合在一起(排序),计算相同的运行次数,以所需的格式输出。

tail -n +2 txt.txt | cut -d',' -f 1 | sort | uniq -c | awk '{ print $2, $1 }'

输出

bob 2
jim 1
joe 1
mike 3
于 2013-02-17T00:44:27.650 回答
10

看起来你想要排序的输出。您可以简单地通过管道或打印到sort -nk 2

awk -F, 'NR>1 { a[$1]++ } END { for (i in a) print i, a[i] | "sort -nk 2" }' file

结果:

jim 1
joe 1
bob 2
mike 3

但是,如果您已GNU awk安装,则可以在没有 coreutils 的情况下执行排序。这是将数组按其值排序的单进程解决方案。解决方案仍然应该很快。像这样运行:

awk -f script.awk file

内容script.awk

BEGIN {
    FS=","
}

NR>1 {
    a[$1]++
}

END {
    for (i in a) {
        b[a[i],i] = i
    }

    n = asorti(b)

    for (i=1;i<=n;i++) {
        split (b[i], c, SUBSEP)
        d[++x] = c[2]
    }

    for (j=1;j<=n;j++) {
        print d[j], a[d[j]]
    }
}

结果:

jim 1
joe 1
bob 2
mike 3

或者,这是单线:

awk -F, 'NR>1 { a[$1]++ } END { for (i in a) b[a[i],i] = i; n = asorti(b); for (i=1;i<=n;i++) { split (b[i], c, SUBSEP); d[++x] = c[2] } for (j=1;j<=n;j++) print d[j], a[d[j]] }' file
于 2013-02-17T01:50:39.317 回答
4

严格的 awk 解决方案...

BEGIN { FS = "," }
{ ++x[$1] }
END { for(i in x) print i, x[i] }

如果name, age确实在文件中,您可以调整 awk 程序以忽略它...

BEGIN   { FS = "," }
/[0-9]/ { ++x[$1] }
END     { for(i in x) print i, x[i] }
于 2013-02-17T00:49:13.563 回答
0

我根据此处的答案提出了两个功能:

topcpu() {
    top -b -n1                                                                                  \
        | tail -n +8                                                                            \
        | awk '{ print $12, $9, $10 }'                                                          \
        | awk '{ CPU[$1] += $2; MEM[$1] += $3 } END { for (k in CPU) print k, CPU[k], MEM[k] }' \
        | sort -k3 -n                                                                           \
        | tail -n 10                                                                            \
        | column -t                                                                             \
        | tac
}

topmem() {
    top -b -n1                                                                                  \
        | tail -n +8                                                                            \
        | awk '{ print $12, $9, $10 }'                                                          \
        | awk '{ CPU[$1] += $2; MEM[$1] += $3 } END { for (k in CPU) print k, CPU[k], MEM[k] }' \
        | sort -k2 -n                                                                           \
        | tail -n 10                                                                            \
        | column -t                                                                             \
        | tac
}
$ topcpu
chrome           0    75.6
gnome-shell      6.2  7
mysqld           0    4.2
zsh              0    2.2
deluge-gtk       0    2.1
Xorg             0    1.6
scrcpy           0    1.6
gnome-session-b  0    0.8
systemd-journal  0    0.7
ibus-x11         6.2  0.7

$ topmem
top              12.5  0
Xorg             6.2   1.6
ibus-x11         6.2   0.7
gnome-shell      6.2   7
chrome           6.2   74.6
adb              6.2   0.1
zsh              0     2.2
xdg-permission-  0     0.2
xdg-document-po  0     0.1
xdg-desktop-por  0     0.4

请享用!

于 2020-06-29T08:54:12.777 回答
0

猫文件.txt | 剪切-d',' -f 1 | 排序 | 唯一的-c

2 bob
1 jim
1 joe
3 mike
于 2020-11-25T17:14:55.403 回答