我有一个脚本在RPi上运行在Debian上,它会随着时间的推移生成如下编号的输出,每行的第一个字符串用于将匹配的项分组在一起:
/1 AtherosC_92:f1:a7 BTHub4-NJ8S -82
/1 AtherosC_92:f1:a7 BTHub4-NJ8S -81
/2 95:8c:ed:6d:65:f5 Home245 -84
/1 AtherosC_92:f1:a7 BTHub4-NJ8S -78
/3 3d:cc:54:d1:4f:f6 BTWifi2 -82
/4 Apple_e5:e8:2d SKYBD80F -71
/4 Apple_e5:e8:2d SKYBD80F -71
/4 Apple_e5:e8:2d SKYBD80F -72使用以下脚本完成分组:
declare -Ai seen=()
while read && read -r first _ <<< "$REPLY" ; do
[[ $first ]] && printf '/%d %s\n' "${seen["$first"]=$((${#seen[@]}+1))}" "$REPLY"
done每个列表开头的数字用于在目标程序中对它们进行排序。我需要一个方法在生成一个较高的数字之前进行检查,以查看最近是否出现了一个较低的数字(在过去30秒左右),如果没有,则重用该数字。因此,例如,如果主命令在>30秒内未输出/1,则在生成第三个唯一字符串时将发生以下情况:
/1 AtherosC_92:f1:a7 BTHub4-NJ8S -82
/1 AtherosC_92:f1:a7 BTHub4-NJ8S -81
/2 95:8c:ed:6d:65:f5 Home245 -84
/1 3d:cc:54:d1:4f:f6 BTWifi2 -82对于如何实现这一点,有什么建议吗?无论是在狂欢中还是在其他地方?
发布于 2015-03-27 22:22:42
这是Generate unique tags to repeating results of a command的后续
这里有一种可能性:我们将引入另外两个数组,tags和tags_time。它们的键是使用的标记;tags的字段是输出中对应的字符串(关联数组seen的键),tags_time的字段是上次使用标记时的时间戳。
然后,我们引入一个函数get_tag来解析1 up中的整数,如果一个整数是空闲的(即,对应于没有键,或者在几秒钟前使用的次数超过了delay ),则从我们的数据中删除它,并将其作为新的索引返回使用。
#!/bin/bash
declare -A seen
tags=()
tags_time=()
delay=30
get_tag() {
local i
for ((i=1;;++i)); do
if [[ -z ${tags[i]} ]] || ((tags_time[i] < SECONDS-delay)); then
break
fi
done
if [[ ${tags[i]} ]]; then
unset 'seen[${tags[$i]}]' "tags[i]" "tags_time[i]"
fi
get_tag_ret=$i
}
while read; do
read -r first _ <<< "$REPLY"
[[ $first ]] || continue
if [[ -z ${seen["$first"]} ]]; then
get_tag
seen["$first"]=$get_tag_ret
tags[get_tag_ret]=$first
tags_time[get_tag_ret]=$SECONDS
fi
printf '\\%d %s\n' "${seen["$first"]}" "$REPLY"
done我还没有测试过。
https://stackoverflow.com/questions/29118889
复制相似问题