我可以使用变量作为AWK的{print}参数吗?

时间:2016-05-04 05:36:20

标签: linux bash awk sh

我有这个bash语句用于从.csv文件打印特定单元格。

set `cat $filename | awk -v FS=',' '{print $2}' | head -5 | tail -n 1`

'{print $2}'部分确定列,head -5部分确定行。

我可以替换$counter变量代替$2(例如'{print $counter}')吗?

2 个答案:

答案 0 :(得分:1)

答案是“是” - 并且有几种方法可以做你想要的。正确的方法是使用-v

声明 awk 变量
awk -F',' -v c=$counter 'NR==6 { print $c; exit }' "$filename"

(你会原谅我移动一些东西来做 awk 中的所有事情,安全地将"$filename"传递给 awk ,以及摆脱{ {1}}和后退 - 这对事业没有任何作用。)

另一种方法是采用一种“hackish”方式 - 利用shell引用规则。此方法需要一些转义,以确保shell不解释第一个set字符(引用 awk 中的预期字段)...以下适用于 bash (以及POSIX sh ):

$

答案 1 :(得分:0)

是的,所有管道都可以拆除。变量将awk传递给-v var=value

试试这个测试版本。为colrow变量提供值:

set $(awk -F "," -v col=2 -v row=5 'NR==row {print $col; exit}' "${filename}")

$(command)优先于`command`,稍后会弃用。

NR是当前行号。

"${filename}"由shell扩展为其值:如果文件名包含一些特殊字符,双引号将有所帮助。