我有一个命令(cmd1),它可以通过日志文件来过滤出一组数字。这些数字是随机顺序的,因此我使用sort -gr获取数字的反向排序列表。此排序列表中可能有重复项。我需要在该列表中找到每个唯一编号的计数。
例如,如果cmd1的输出是:
100
100
100
99
99
26
25
24
24
我需要另一个命令,可以将上述输出传递到该命令,以便得到:
100 3
99 2
26 1
25 1
24 2
我有一个命令(cmd1),它可以通过日志文件来过滤出一组数字。这些数字是随机顺序的,因此我使用sort -gr获取数字的反向排序列表。此排序列表中可能有重复项。我需要在该列表中找到每个唯一编号的计数。
例如,如果cmd1的输出是:
100
100
100
99
99
26
25
24
24
我需要另一个命令,可以将上述输出传递到该命令,以便得到:
100 3
99 2
26 1
25 1
24 2
Answers:
怎么样;
$ echo "100 100 100 99 99 26 25 24 24" \
| tr " " "\n" \
| sort \
| uniq -c \
| sort -k2nr \
| awk '{printf("%s\t%s\n",$2,$1)}END{print}'
结果是:
100 3
99 2
26 1
25 1
24 2
100 3 99 2 26 1 25 1 24 2 2 24
echo "100 100 100 99 99 26 25 24 24" | tr " " "\n" | sort | uniq -c | sort -k2nr | awk '{printf("%s\t%s\n",$2,$1)}END{print}' | head -n -1
这样您将获得:100 3 99 2 26 1 25 1 24 2
uniq -c
至少适用于GNU uniq 8.23,并且完全符合您的要求(假设已排序的输入)。
sort
命令:sort file_name | uniq -c
对数字进行反向数字排序,然后计算重复项,然后交换左右单词。对齐列。
printf '%d\n' 100 99 26 25 100 24 100 24 99 \
| sort -nr | uniq -c | awk '{printf "%-8s%s\n", $2, $1}'
100 3
99 2
26 1
25 1
24 2
在Bash中,我们可以使用关联数组对每个输入值的实例进行计数。假设我们有命令$cmd1
,例如
#!/bin/bash
cmd1='printf %d\n 100 99 26 25 100 24 100 24 99'
然后,我们可以a
使用++
数学运算符对相关数组条目计数数组变量中的值:
while read i
do
((++a["$i"]))
done < <($cmd1)
我们可以打印结果值:
for i in "${!a[@]}"
do
echo "$i ${a[$i]}"
done
如果输出顺序很重要,则可能需要外部sort
键:
for i in $(printf '%s\n' "${!a[@]}" | sort -nr)
do
echo "$i ${a[$i]}"
done