Linux Bash:查询CSV指定列中特定内容的所在行号
解决方案
要正确获取CSV文件中指定列包含目标内容的行号,我们可以修改awk脚本逻辑,先定位目标列的索引,再逐行检查匹配内容并输出对应行号。下面是修正后的wanted_line_number赋值代码:
wanted_line_number=$(awk '-F[ ]*,[ ]*' -v col="$col" -v target="$value_of_interest" ' FNR == 1 { # 遍历第一行(列标题行),找到目标列的索引 for (i = 1; i <= NF; ++i) { if ($i == col) { col_idx = i; break; } } # 如果未找到指定列,退出并返回错误状态 if (i > NF) exit 1; next; } # 从第二行开始,检查目标列内容是否匹配目标值 $col_idx == target { print FNR; } ' file.csv)
执行期望的输出命令:
echo "The wanted line number are:" echo $wanted_line_number
代码细节解释
- 分隔符处理:
-F[ ]*,[ ]*的作用是忽略逗号前后的空格(包括制表符),确保能正确分割CSV字段,避免因字段首尾空格导致匹配失败。 - 列索引定位:在第一行(列标题行)遍历所有列,找到与
col变量匹配的列名,记录其索引col_idx,后续就通过这个索引定位目标列。 - 行匹配逻辑:跳过标题行后,逐行检查目标列的内容是否等于
target(即value_of_interest),匹配时输出当前行号FNR(因为列标题算作第一行,所以行号从1开始计数)。 - 异常处理:如果第一行找不到指定列,
awk会退出并返回状态码1,方便后续脚本做异常判断。
原代码问题说明
你提供的原有代码逻辑是统计目标列非空的最大行号,这和需求中“找到包含特定内容的行号”完全不符,因此需要把统计逻辑替换成精准的内容匹配逻辑。
测试给定的file.csv,运行上述代码后,wanted_line_number会被正确赋值为4,符合期望输出。
内容的提问来源于stack exchange,提问作者user13908778
相关产品推荐
相关产品推荐

