2012-11-30 57 views
2

我有以下结构(只有一行)如何用awk变量在外壳

col1 col2 col3 col4 
---------------------- 
12 34 14 10 

什么,我需要做的就是我要取COL2和COL4和使用的外壳,值。

a=$(awk 'NR<2{$2}') 
b=$(awk'NR<2{$4}') 

我必须在我的shell脚本中使用a和b。 但这不是一个好主意,因为我使用awk两次,而我正在提取像这样的值。

awk'NR<2{ a=$2;b=$4}'

,但我不知道我可以在我的外壳使用a和b。

回答

4

用eval你可以在一个awk命令中分配更多的shell变量。看到下面的测试:我只是复制你的输入例如

kent$ echo $a,$b 
, 

kent$ cat test 
col1 col2 col3 col4 
---------------------- 
12 34 14 10 

kent$ eval $(awk 'NR==3{print "a="$2;print "b="$4}' test) 

kent$ echo $a,$b 
34,10 

注意到,与头/标题等于是在我的脚本的数据线是NR = 3。你可以调整它,如果它不是你的情况。

+0

不要使用eval,除非它是绝对必要的,在这种情况下它不是。 –

1

内置的read在这里很有用。

read _ a _ b _ < <(tail -n +3 data.txt) # Assign the columns you don't care about to _ 
echo $a,$b 

这避免了使用eval,这通常应该避免,如果你能找到另一种选择。

0
$ v=($(awk 'NR==3{print $2 ORS $4}' file)) 
$ a="${v[0]}" 
$ b="${v[1]}" 
$ echo "$a,$b" 
34,10