Bash脚本如何比较数组元素与字符串 统计指定坐标不同日期数据量
需求说明
testhomerseklet3.txt文件每行按顺序存储x坐标、y坐标、日期、时间、数值5个字段,字段间用英文逗号分隔。需要编写接收x、y两个入参的Bash脚本,输出指定x、y坐标下对应数据去重后的不同日期总数量。
原有脚本存在的问题
原有脚本无法得到正确结果,核心错误点如下:
- 变量赋值语法错误:修改isDateAlready变量时多写了$符号,
$isDateAlready=1属于非法语法,应为isDateAlready=1 - 数组追加元素写法错误:
dateT+=$date是将日期字符串拼接到数组第一个元素末尾,而非追加为新的数组元素,正确写法为dateT+=("$date") - 输入读取方式有隐患:
done <<< $(cat homerseklettest3.txt)会将文件内容全部展开后传入,遇到特殊字符、换行异常时容易出错,直接通过文件重定向done < homerseklettest3.txt更稳定 - 变量未加引号包裹:字符串对比时未给变量加双引号,遇到空值、带空格的内容时会触发语法错误
修正后的完整脚本
#!/bin/bash # 入参合法性校验 if [ $# -ne 2 ];then echo "使用说明:请传入两个参数,分别为x坐标、y坐标" exit 1 fi howMany=0 declare -a dateT echo "传入x坐标: $1" echo "传入y坐标: $2" echo # 直接按逗号分隔读取字段,无需额外cut处理 while IFS=, read -r x y date time value || [ -n "$x" ] do isDateAlready=0 if [ "$x" = "$1" ] && [ "$y" = "$2" ] then # 遍历已存储的日期判断是否重复 for existed_date in "${dateT[@]}" do if [ "$existed_date" = "$date" ] then isDateAlready=1 break fi done # 新日期则计数+1并存入数组 if [ $isDateAlready -eq 0 ] then howMany=$((howMany + 1)) dateT+=("$date") fi fi done < homerseklettest3.txt echo "不同日期出现总次数: $howMany"
测试验证
基于提供的测试文件,运行示例:
- 统计x=92.7418529、y=99.9999999对应的不同日期数:
运行命令:bash count_date.sh 92.7418529 99.9999999
输出结果:不同日期出现总次数: 3,对应日期分别为1500.10.9、1760.5.10、1761.5.10,结果正确。 - 统计x=23.1231234、y=69.9651548对应的不同日期数:
运行命令:bash count_date.sh 23.1231234 69.9651548
输出结果:不同日期出现总次数: 2,对应日期分别为2000.11.13、2010.8.20,结果正确。
内容的提问来源于stack exchange,提问作者SnowballAvocado
相关产品推荐
相关产品推荐

