我在Debian上运行一个RPi上的脚本,它会随着时间的推移生成编号输出,每行的第一个字符串用于将匹配项组合在一起:
/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
是否有任何关于如何实现这一目标的建议?无论是在bash还是其他什么?
答案 0 :(得分:1)
这是Generate unique tags to repeating results of a command
的后续行动这是一种可能性:我们将引入另外两个阵列tags
和tags_time
。他们的钥匙是使用的标签; tags
的字段是输出中的对应字符串(关联数组seen
的键),tags_time
的字段是上次使用标记时的时间戳。
然后我们引入一个函数get_tag
来解析1
中的整数,如果一个整数是空闲的(即,对应于没有键或者使用的时间超过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
我还没有测试过它。