awk / Unix group by

时间:2013-02-17 00:40:32

标签: unix awk

有这个文本文件:

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

试图得到这个(数):

joe 1
jim 1
bob 2
mike 3

谢谢,

6 个答案:

答案 0 :(得分:66)

$ 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)使用arr密钥
  • 迭代a
  • print a使用, arr[a]密钥
  • 打印密钥a数组

答案 1 :(得分:24)

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

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

输出

bob 2
jim 1
joe 1
mike 3

答案 2 :(得分:8)

看起来你想要排序输出。您可以直接管道或打印到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

答案 3 :(得分:4)

严格意义上的解决方案......

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] }

答案 4 :(得分: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

享受!

答案 5 :(得分:0)

cat file.txt |切-d','-f 1 |排序uniq -c

2 bob
1 jim
1 joe
3 mike