我有这个bash语句用于从.csv文件打印特定单元格。
set `cat $filename | awk -v FS=',' '{print $2}' | head -5 | tail -n 1`
'{print $2}'
部分确定列,head -5
部分确定行。
我可以替换$counter
变量代替$2
(例如'{print $counter}'
)吗?
答案 0 :(得分:1)
答案是“是” - 并且有几种方法可以做你想要的。正确的方法是使用-v
:
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
。
试试这个测试版本。为col
和row
变量提供值:
set $(awk -F "," -v col=2 -v row=5 'NR==row {print $col; exit}' "${filename}")
$(command)
优先于`command`,稍后会弃用。
NR
是当前行号。
"${filename}"
由shell扩展为其值:如果文件名包含一些特殊字符,双引号将有所帮助。