如何用Bash脚本将带范围的数据行增量展开?
Bash脚本实现数据增量展开方案
我来帮你搞定这个数据展开的需求!你的输入是包含年份和带区间的标识字符串,需要把每个区间拆分成连续的数值项,生成对应的完整条目。下面是一个可以直接用的Bash脚本方案,附带详细说明:
完整脚本代码
#!/bin/bash # 处理输入:无参数时从标准输入读取,有参数则用传入的字符串 if [[ $# -eq 0 ]]; then input=$(cat) else input="$1" fi # 将输入中的$替换为换行,同时清理首尾空格,方便逐行处理 processed_input=$(echo "$input" | sed -e 's/\$/\n/g' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') # 逐行解析每一组年份+标识数据 echo "$processed_input" | while IFS=' ' read -r year identifier; do # 跳过空行或无效条目 [[ -z "$year" || -z "$identifier" ]] && continue # 拆分标识字符串:提取固定前缀和区间部分 prefix=$(echo "$identifier" | awk -F'/' '{print $1"/"}') range_str=$(echo "$identifier" | awk -F'/' '{print $2}') # 拆分区间为起始和结束数字 start=$(echo "$range_str" | awk -F'-' '{print $1}') end=$(echo "$range_str" | awk -F'-' '{print $2}') # 验证区间有效性,避免非数字或反向区间 if ! [[ "$start" =~ ^[0-9]+$ && "$end" =~ ^[0-9]+$ && "$start" -le "$end" ]]; then echo "Warning: Invalid range in '$identifier', skipping this entry." >&2 continue fi # 循环生成所有展开后的条目 for ((i=start; i<=end; i++)); do echo -n "$ $year ${prefix}${i} " done done # 最后补一个换行,让输出格式更整洁 echo
使用方法
你可以通过三种方式运行这个脚本:
- 直接传入输入字符串
./expand_data.sh "$ 2001 xei_1/2-10 $ 2002 xei_2/3-7 "
- 从文件读取输入
如果你的数据存在文件(比如data.txt)中,直接通过管道传入:
./expand_data.sh < data.txt
- 管道传递输入
结合echo或其他命令的输出作为输入:
echo "$ 2001 xei_1/2-10 $ 2002 xei_2/3-7 " | ./expand_data.sh
关键逻辑说明
- 输入预处理:把输入中的
$替换为换行,让每一组年份 标识单独成行,同时清理多余空格,避免空行干扰解析。 - 标识拆分:用
awk按/分割标识字符串,分离出固定前缀(比如xei_1/)和区间部分(比如2-10);再按-拆分区间得到起始和结束数字。 - 有效性校验:检查起始/结束是否为有效数字,且起始不大于结束,避免无效区间导致脚本报错。
- 条目生成:通过
for循环遍历区间内的每个数字,逐个生成符合要求的条目,用echo -n保持所有条目在同一行输出。
测试效果
输入你的示例数据后,脚本会输出:
$ 2001 xei_1/2 $ 2001 xei_1/3 $ 2001 xei_1/4 $ 2001 xei_1/5 $ 2001 xei_1/6 $ 2001 xei_1/7 $ 2001 xei_1/8 $ 2001 xei_1/9 $ 2001 xei_1/10 $ 2002 xei_2/3 $ 2002 xei_2/4 $ 2002 xei_2/5 $ 2002 xei_2/6 $ 2002 xei_2/7
完全匹配你期望的格式。
内容的提问来源于stack exchange,提问作者Kaye
相关产品推荐
相关产品推荐

