2013-02-14 84 views

回答

5

悦目不同的方法:

$ echo $var 
one two three 

$ field=3 

$ echo $var | awk -v f="$field" '{print $f}' 
three 

$ field=2 

$ echo $var | awk -v f="$field" '{print $f}' 
two 
+0

做到了。谢谢。 – senorsmile 2013-02-14 20:29:27

+0

很高兴我可以帮助:) – 2013-02-14 20:31:13

+1

+1为正确的方法,但双引号你的shell变量。 – 2013-02-14 22:04:14

2

你几乎得到了它......

$ myfield='$3' 
$ echo $var | awk "{print $myfield}" 
three 

硬盘报价在第一行防止$3解释由shell。第二行的软引号允许变量替换。

+0

这很合理!我需要通过2美元,而不是2美元的价值。谢谢。 – senorsmile 2013-02-14 20:17:33

+0

除了我需要从shell传递变量。例如silo.sh东西5,所以1美元=东西和2美元= 5,因此传递5美元从awk命令打印第5项。 – senorsmile 2013-02-14 20:21:36

+0

不要这样做,因为当你的shell变量包含一些字符时,会导致奇怪的错误。请参阅http://cfajohnson.com/shell/cus-faq-2.html#Q24将shell变量的值传递给awk脚本的正确方法。这个答案的外壳部分也有其他问题。 – 2013-02-14 22:02:52

0

,可以串联使用变量的awk语句的部分。也许这是你在你的脚本文件想要什么:

echo $1|awk '{print($'$2');}'

这里的部分{print($和局部变量$ 2和);}被连接起来,并给AWK值。

编辑:经过一些建议,而不是使用这个。也许是一次性解决方案。最好习惯于马上做正确的事情 - 请参阅第一条评论中的链接。

+1

不要这样做,因为当你的shell变量包含一些字符时,会导致奇怪的错误。请参阅cfajohnson.com/shell/cus-faq-2.html#Q24将shell变量的值传递给awk脚本的正确方法。这个答案的外壳部分也有其他问题。 – 2013-02-14 22:03:36

+0

@EdMorton:你能举出两个问题的例子吗?如果我控制输入,是否还有一个不使用串联语句的理由? – valid 2013-02-14 22:23:36

+0

尝试使用$ 1和/或$ 2等于*或$ 2未填充或设置为非数字值或....不使用连接语句的最佳原因可能是没有理由使用连接语句,并且如果您总是以正确的方式去做,那么当你不像你想象的那样控制输入时,你不会错误地错误地使用它。同上引用你的shell变量。 – 2013-02-15 02:14:25