You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
测试验证

基于提供的测试文件,运行示例:

  1. 统计x=92.7418529、y=99.9999999对应的不同日期数:
    运行命令:bash count_date.sh 92.7418529 99.9999999
    输出结果:不同日期出现总次数: 3,对应日期分别为1500.10.9、1760.5.10、1761.5.10,结果正确。
  2. 统计x=23.1231234、y=69.9651548对应的不同日期数:
    运行命令:bash count_date.sh 23.1231234 69.9651548
    输出结果:不同日期出现总次数: 2,对应日期分别为2000.11.13、2010.8.20,结果正确。

内容的提问来源于stack exchange,提问作者SnowballAvocado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:15:04