如何在Linux Shell循环中动态传递列位置(如$2)
解决Shell脚本动态传递awk列位置的问题
先直接点出原脚本的核心问题,再给修正方案和说明:
原脚本的两处错误
- 参数传递错误:调用函数时写
$2、$3,Shell会把它们当成当前脚本的位置参数(比如脚本运行时输入的第2、3个参数),而不是把"2"、"3"作为列号传给函数。 - awk逻辑错误:
c2 == 1是在判断列号等于1,而不是对应列的数值等于1,完全搞反了判断目标。
修正后的脚本
#!/bin/bash twopq () { # 第一个参数是第一列的匹配值,第二个参数是要检查的列号 awk -v target="$1" -v col="$2" '$1 == target && $col == 1' temp1 > temp2 } # 直接传递列号数字,不要带$符号 twopq a 2 twopq b 3
关键说明
- 参数传递:直接传列号的数字(2、3),这样函数能拿到正确的列位置,不会和Shell的位置参数混淆。
- awk动态列引用:在awk里用
$col就能动态引用对应列号的列——比如col是2时,$col就等价于$2,完美实现动态指定列的需求。 - 简化awk代码:awk默认会打印满足条件的行,没必要写冗余的
if(...){print},直接把判断条件写在前面即可。
批量循环处理的扩展
如果需要循环处理多组匹配规则,可以把规则存成数组,批量调用函数:
#!/bin/bash twopq () { awk -v target="$1" -v col="$2" '$1 == target && $col == 1' temp1 >> temp2 # 用>>追加结果,避免每次调用覆盖temp2 } # 定义多组规则:第一列匹配值 要检查的列号 rules=( "a 2" "b 3" "c 2" ) # 先清空temp2,避免历史内容干扰 > temp2 for rule in "${rules[@]}"; do twopq $rule done # 查看最终结果 cat temp2
内容的提问来源于stack exchange,提问作者Mr T.
相关产品推荐
相关产品推荐

