基于Unix环境的滑动窗口式数组分组实现方案咨询
Unix环境下实现数组滑动窗口分组
Bash脚本实现(处理内存数组)
直接利用Bash的数组切片特性实现,支持自定义窗口大小g:
#!/bin/bash # 示例数组(可替换为你的目标数组) arr=(a b c d e f g h i j k l m) # 自定义窗口大小 window_size=4 arr_length=${#arr[@]} # 计算最后一个分组的起始索引,保证每个分组都有window_size个元素 max_start_idx=$((arr_length - window_size)) # 遍历所有起始位置,生成滑动窗口分组 for ((i=0; i<=max_start_idx; i++)); do # 从索引i开始截取window_size个元素 current_group=("${arr[@]:i:window_size}") # 输出分组(如需保留元素内空格,用"${current_group[@]}"替代) echo "${current_group[*]}" done
代码说明
${#arr[@]}:获取数组的总元素数${arr[@]:i:window_size}:Bash数组切片语法,从索引i开始提取window_size个元素- 循环范围
0到max_start_idx,确保每个分组都包含完整的window_size个元素,窗口每次滑动1位
awk实现(处理文本流)
如果元素按行存储在文本文件中,用awk可直接处理:
假设输入文件elements.txt内容为:
a b c d e f g h i j k l m
执行命令(替换4为你的窗口大小):
awk -v win=4 '{ buf[NR] = $0 } END { for (start=1; start<=NR-win+1; start++) { for (idx=start; idx<start+win; idx++) { printf "%s ", buf[idx] } print "" } }' elements.txt
代码说明
-v win=4:传递窗口大小参数到awk脚本buf[NR] = $0:将每行内容存入awk数组- 外层循环控制窗口起始位置,内层循环输出当前窗口的所有元素
边界情况处理
- 当窗口大小
g大于数组/文本行数时:脚本自动判断,若g不大于元素总数则生成1个分组,否则无输出 - 若元素包含空格:Bash脚本中输出时使用
"${current_group[@]}",awk脚本无需额外处理(默认按行存储完整元素)
内容的提问来源于stack exchange,提问作者gwot
相关产品推荐
相关产品推荐

