awk/Unix group by

Joh*_*ams 33 unix awk

有这个文本文件:

name, age
joe,42
jim,20
bob,15
mike,24
mike,15
mike,54
bob,21
Run Code Online (Sandbox Code Playgroud)

试图得到这个(数):

joe 1
jim 1
bob 2
mike 3
Run Code Online (Sandbox Code Playgroud)

谢谢,

Gil*_*not 74

$ 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
Run Code Online (Sandbox Code Playgroud)

说明

  • -F, 分裂 ,
  • NR>1 处理第1行后的行
  • arr[$1]++增量数组arr(拆分,),第一列为键
  • END{} 在处理文件结束时执行块
  • for (a in arr)arra密钥迭代
  • print a, arr[a]a键打印键数组

  • 单行awk答案+1(这是问题中的标签)!我喜欢在这里学习...... (3认同)
  • 一个小的修改允许你求和而不是仅仅计算记录:`awk -F, 'NR>1{arr[$1]+=$2}END{for (a in arr) print a, arr[a]}'文件.txt'` (2认同)

nne*_*neo 25

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

tail -n +2 txt.txt | cut -d',' -f 1 | sort | uniq -c | awk '{ print $2, $1 }'
Run Code Online (Sandbox Code Playgroud)

产量

bob 2
jim 1
joe 1
mike 3
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 9

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

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

结果:

jim 1
joe 1
bob 2
mike 3
Run Code Online (Sandbox Code Playgroud)

但是,如果已GNU awk安装,则可以在不使用coreutils的情况下执行排序.这是单个进程解决方案,它将按照值对数组进行排序.解决方案仍然应该很快.运行如下:

awk -f script.awk file
Run Code Online (Sandbox Code Playgroud)

内容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]]
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

jim 1
joe 1
bob 2
mike 3
Run Code Online (Sandbox Code Playgroud)

或者,这是单行:

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
Run Code Online (Sandbox Code Playgroud)