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,
上拆分,
处理第1行之后的行NR>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
之前插入asort-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