我要分析约54,000个数据包,我正在尝试确定每秒的平均数据包数量(以及给定秒数内的最小和最大数据包数量)
我的输入文件是数据包时间的一列(请参见下面的示例):
0.004
0.015
0.030
0.050
..
..
1999.99
我已经使用awk来确定时间增量,但无法找到一种方法来解析时间块以获得以下输出:
0-1s = 10 packets
1-2s = 15 packets
等
答案 0 :(得分:0)
这是如何使用awk获得所需输出的示例。 假设原始输入文件是sample.txt,首先要做的是对它进行反向排序(排序-nr),然后可以通过awk“ -v”参数向awk提供新排序的文件以及时间变量。在awk中执行测试,在需要时使用“下一个”跳过行,并使用“退出”退出awk脚本。
#!/bin/bash
#
for i in 0 1 2 3
do
sort -nr sample.txt |awk -v time=$i 'BEGIN{number=0}''{
if($1>=(time+1)){next}
else if( $1>=time && $1 <(time+1))
{number+=1}
else{
printf "[ %d - %d [ : %d records\n",time,time+1,number;exit}
}'
done
这是示例文件:
0.1
0.2
0.8
.
.
0.94
.
.
1.5
1.9
.
3.0
3.6
这是程序的输出:
[ 1 - 2 [ : 5 records
[ 2 - 3 [ : 8 records
[ 3 - 4 [ : 2 records
希望这会有所帮助!
答案 1 :(得分:0)
请您尝试以下操作:
使用bash
:
max=0
while read -r line; do
i=${line%.*} # extract the integer part
a[$i]=$(( ${a[$i]} + 1 )) # increment the array element
(( i > max )) && max=$i # update the maximum index
done < sample.txt
# report the summary
for (( i=0; i<=max; i++ )); do
printf "%d-%ds = %d packets\n" "$i" $(( i+1 )) "${a[$i]}"
done
使用AWK
:
awk '
{
i = int($0)
a[i]++
if (i > max) max = i
}
END {
for (i=0; i<=max; i++)
printf("%d-%ds = %d packets\n", i, i+1, a[i])
}' sample.txt
sample.txt:
0.185
0.274
0.802
1.204
1.375
1.636
1.700
1.774
1.963
2.044
2.112
2.236
2.273
2.642
2.882
3.000
3.141
5.023
5.082
输出:
0-1s = 3 packets
1-2s = 6 packets
2-3s = 6 packets
3-4s = 2 packets
4-5s = 0 packets
5-6s = 2 packets
希望这会有所帮助。