Shell脚本更新CSV的ASOF_DATE列出现空值,请求排查问题
排查Shell脚本更新CSV文件ASOF_DATE列为空值的问题
尝试用Shell脚本更新CSV文件,将ASOF_DATE列的值替换为指定日期,但执行后该列返回空值,以下是相关信息:
示例输入数据
ASOF_DATE,CUSIP,Current Face,Market Value '04/08/2024',BENRDUZU0,-400000000 '04/08/2024',BENRDUZR7,-300000000 '04/08/2024',BENRE4H37,-225000000 '04/08/2024',BENRDUYW7,-250000000
原Shell脚本
#!/bin/bash if [ "$#" -lt 1 ]; then echo "Argument is missing" exit 1 fi asOnDate=$1 FILE_PATH=/awsdatalake/data/inbound/file/SRC_TPGCF/ if [ ! -f ${FILE_PATH}CFG_ANALYTICS_*.csv ] then echo "File does not exist" exit 2 else echo "File found." for file in ${FILE_PATH}CFG_ANALYTICS_*.csv do echo "$file" awk -v date="$asof_date" -F, 'BEGIN {OFS=","} {if (NR==1) {print $0} else {if (NR>1) {$1=date; print}}}' "$file" > temp_file && mv temp_file "$file" echo "Current date $asof_date added to the ASOF_DATE column in $file_path" done fi
问题原因及修复方案
1. 变量名大小写拼写错误
脚本中定义的变量是asOnDate,但在awk调用和后续echo中使用的是$asof_date,大小写不匹配导致变量值为空,替换后ASOF_DATE列自然为空。
2. 文件路径变量错误
最后echo语句中使用了未定义的$file_path(小写),而实际循环中的文件变量是$file,正确的变量名应该是$file。
3. 多文件匹配时的检查逻辑问题
[ ! -f ${FILE_PATH}CFG_ANALYTICS_*.csv ]在匹配到多个文件时会报错,因为-f只能检查单个文件。可以开启nullglob选项,让匹配不到文件时返回空,再判断是否有文件存在。
4. 可选:保留日期的单引号格式
原数据中ASOF_DATE值带单引号,若传入的日期没有引号,替换后会丢失该格式,可根据需求给传入的日期添加单引号。
修复后的脚本
#!/bin/bash if [ "$#" -lt 1 ]; then echo "Argument is missing" exit 1 fi # 统一变量名,可选:给日期添加单引号以匹配原格式 asOnDate="'$1'" FILE_PATH=/awsdatalake/data/inbound/file/SRC_TPGCF/ # 开启nullglob,避免无匹配时返回原通配符字符串 shopt -s nullglob files=(${FILE_PATH}CFG_ANALYTICS_*.csv) shopt -u nullglob if [ ${#files[@]} -eq 0 ]; then echo "File does not exist" exit 2 else echo "File found." for file in "${files[@]}" do echo "$file" # 使用正确的变量名asOnDate,简化awk逻辑 awk -v date="$asOnDate" -F, 'BEGIN {OFS=","} NR==1{print; next} {$1=date; print}' "$file" > temp_file && mv temp_file "$file" echo "Current date $asOnDate added to the ASOF_DATE column in $file" done fi
内容的提问来源于stack exchange,提问作者Loganayaki mahalingam
相关产品推荐
相关产品推荐

