Awk/Unix分组依据

Awk/Unix分组依据,unix,awk,Unix,Awk,拥有此文本文件: name, age joe,42 jim,20 bob,15 mike,24 mike,15 mike,54 bob,21 正在尝试获取此(计数): 谢谢,去掉标题行,删除年龄字段,将相同的名称分组(排序),计算相同的运行次数,以所需格式输出 tail -n +2 txt.txt | cut -d',' -f 1 | sort | uniq -c | awk '{ print $2, $1 }' 输出 bob 2 jim 1 joe 1 mike 3 一个严格的awk解决

拥有此文本文件:

name, age
joe,42
jim,20
bob,15
mike,24
mike,15
mike,54
bob,21
正在尝试获取此(计数):


谢谢,

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

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

bob 2
jim 1
joe 1
mike 3

一个严格的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] }
解释
  • -F,
    上拆分,
  • NR>1
    处理第1行之后的行
  • arr[$1]+
    增量数组
    arr
    (用
    拆分),第一列为键
  • END{}
    块在处理文件结束时执行
  • 用于(arr中的a)
    使用
    a
    键在
    arr
    上迭代
  • 使用
    a
    键打印一个
    键,arr[a]
    数组

看起来您需要排序输出。您只需将管道或打印到
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
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]]
    }
}
或者,这里有一个班轮:

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

awk-F,'NR>1{a[$1]+}END{for(i in a)b[a[i],i]=i;n=asorti(b);for(i=1;i我根据这里的答案提出了两个函数:

topcpu(){
top-b-n1\
|尾部-n+8\
|awk“{打印$12,$9,$10}”\
|awk'{CPU[$1]+=$2;MEM[$1]+=$3}END{for(CPU中的k)打印k,CPU[k],MEM[k]}'\
|排序-k3-n\
|尾-N10\
|t列\
|交咨会
}
topmem(){
top-b-n1\
|尾部-n+8\
|awk“{打印$12,$9,$10}”\
|awk'{CPU[$1]+=$2;MEM[$1]+=$3}END{for(CPU中的k)打印k,CPU[k],MEM[k]}'\
|排序-k2-n\
|尾-N10\
|t列\
|交咨会
}
$topcpu
铬0.75.6
侏儒外壳6.27
mysqld0.4.2
zsh02.2
洪水gtk 0 2.1
Xorg 0 1.6
scrcpy 0 1.6
gnome-session-B0.8
系统日志0.7
ibus-x11 6.2 0.7
$topmem
前12.50名
Xorg 6.2 1.6
ibus-x11 6.2 0.7
侏儒外壳6.27
铬6.2 74.6
亚洲开发银行6.20.1
zsh02.2
xdg权限-0.2
xdg文件po 0.1
xdg桌面por 0.4

享受吧!

cat file.txt | cut-d','-f1 | sort | uniq-c

2 bob
1 jim
1 joe
3 mike

+1表示快速简洁的答案!我只完成了一半…你按字母顺序给出(没有被要求…)我们将看看OP希望它如何排序,如果有的话。(要按计数排序,请在
awk
之前插入a
sort-n
)。+1表示一行awk答案(这是问题中的标记)!我喜欢在这里学习…有什么评论为什么“迈克”印在“鲍勃”之前,而“鲍勃”第一次出现在“迈克”之前在文件中?…数组在
awk
中被任意排序。因此,输出顺序无法保证。我现在看到,NR跳过第1行,END之后的所有内容只运行一次。thx!一个小的修改允许您对年龄进行求和,而不是只计算记录:
awk-F,'NR>1{arr[$1]+=$2}END{for(arr中的A)print A,arr[A]}“file.txt”
喜欢使用/[0-9]/地址只处理其中包含年龄的行。。。
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
2 bob
1 jim
1 joe
3 mike