Bash函数检测CSV多余逗号行时awk命令变量引用冲突问题求解
问题根源
你猜测的函数入参$1与awk字段$1的冲突不是核心问题,二者分属Bash和awk两个独立的解释器环境,天然隔离不会互相干扰。
真正的问题是:awk脚本包裹在单引号中,Bash不会自动解析单引号内的变量,你没有将Bash中的correct_no_of_commas变量正确传递给awk。你修改后的代码只传递了没用的table_name变量,awk内部读取$correct_no_of_commas时会识别为未定义的空值,相当于判断$1 > 0,所以所有行都会匹配输出。
修复方案
将correct_no_of_commas通过-v参数传递给awk即可,如果你只需要输出行号,可以直接打印awk的第二字段:
get_bad_lines () { local table_name=$1 local correct_no_of_commas=$(head -n 1 $table_name/${table_name}_0_0_0.csv | tr -cd , | wc -c) local no_of_files=$(ls $table_name | wc -l) for i in $(seq 0 $(( ${no_of_files}-1 ))) do # 检查文件是否存在 if [ ! -f "$table_name/${table_name}_0_${i}_0.csv" ]; then echo "File: ${table_name}_0_${i}_0.csv not found!" continue fi echo "${table_name}_0_${i}_0.csv has over $correct_no_of_commas commas in the following lines:" # 传递correct_no_of_commas到awk,直接输出行号 grep -o -n ',' "$table_name/${table_name}_0_${i}_0.csv" | cut -d : -f 1 | uniq -c | awk -v expected="$correct_no_of_commas" '$1 > expected {print $2}' done }
可选优化
你可以用awk直接完成整行逗号计数逻辑,减少管道调用提升效率:
# 替换原有grep到awk的整行管道为以下内容 awk -F',' -v expected="$correct_no_of_commas" 'NR>1 && (NF-1) > expected {print NR}' "$table_name/${table_name}_0_${i}_0.csv"
内容的提问来源于stack exchange,提问作者Gustav Rasmussen
相关产品推荐
相关产品推荐

