Bash中如何遍历TSV表格并传递多参数给自定义脚本
实现方案
最稳妥的方案是直接逐行读取TSV内容,跳过表头后直接取每行列值执行脚本,代码如下:
tail -n +2 file.tsv | while IFS=$'\t' read -r col1 col2; do ./script1 "$col1" "$col2" ./script2 "$col1" "$col2" done
各部分逻辑说明:
tail -n +2 file.tsv:跳过文件第一行的表头,仅输出从第二行开始的有效数据IFS=$'\t':将Bash的内置字段分隔符设置为制表符,匹配TSV的分隔规则,避免列内容中包含空格时被误拆分read -r col1 col2:将每行的第一列内容赋值给变量col1、第二列内容赋值给变量col2,-r参数避免内容中的反斜杠被自动转义- 调用脚本时变量外层加双引号,保证带特殊字符的参数可以被脚本正确接收
原写法的问题
你原本将两列分别提取存储的方案容易出现参数错位问题:如果某行存在空列、或者列值包含特殊字符,两个独立提取的列表就无法保证位置对应,不推荐使用。如果确实需要先把内容存到数组,可以用如下写法:
# 声明两个索引数组 declare -a col1_arr col2_arr # 逐行读取填充数组 while IFS=$'\t' read -r c1 c2; do col1_arr+=("$c1") col2_arr+=("$c2") done < <(tail -n +2 file.tsv) # 遍历数组执行脚本 for i in "${!col1_arr[@]}"; do ./script1 "${col1_arr[$i]}" "${col2_arr[$i]}" ./script2 "${col1_arr[$i]}" "${col2_arr[$i]}" done
内容的提问来源于stack exchange,提问作者Giulio Centorame
相关产品推荐
相关产品推荐

