awk命令接受两个变量作为参数并返回一个值

时间:2009-10-14 21:17:57

标签: awk unix

我有一个有50行的文件。每行由三列组成。前两列是变量,它将作为参数传递,以返回第3列的值。 为... command_file.txt是文件,它包含

A B 10
C D 20
E F 30
G H 50
I J 70
...

我有一个包含以下命令的脚本。

#!/user/bin/sh
READ_FILE=/export/home/user/command_file.txt
VA1=A
VA2=B
GET_VALUE=`awk '/ -v var="$VA1" '$1 ~ var' -v var1="$VA2" '$1 ~ var1''/ $READ_FILE l awk '{print $3}'`
echo $GET_VALUE

当我调用此脚本将A和B作为参数传递时,我希望返回值10.但它返回错误。 但是如果我在下面的命令中硬编码它就可以了。

GET_VALUE=`awk '/A B'/ $READ_FILE lawk '{print $3}'`

有什么建议吗? 感谢。

6 个答案:

答案 0 :(得分:8)

你必须在awk脚本开始之前使用awk's变量传递来避免毛茸茸的引用,并修复其他问题:

#!/user/bin/sh
READ_FILE=/export/home/user/command_file.txt
VA1=A
VA2=B
GET_VALUE=$(awk -v var="$VA1" -v var1="$VA2" '$1 ~ var &&  $2 ~ var1 {print $3}' $READ_FILE)
echo $GET_VALUE

答案 1 :(得分:2)

我很抱歉我无法确定您的脚本尝试做什么,所以我无法正确调试它。我想也许你有嵌套的引号或其他东西正在发生。

我认为下面的单行会做你想做的事。

#!/bin/bash
grep "^$1 $2" /export/home/user/command_file.txt | awk '{print $3}'

修改

好的,感谢其他人指出你试图用-v选项做什么。

您的代码在echo GET_VALUE命令中缺少$,并且您有一个字母l而不是管道|。另外还有其他拼写错误。

我认为这有效

READ_FILE=/export/home/user/command_file.txt
awk -v var1=$1 -v var2=$2 '$1 ~ var1 && $2 ~ var2; /^var1 var2/' $READ_FILE | awk '{print $3}'

但我更喜欢上面的grep命令,因为它不需要额外的努力就可以将命令行变量传递给awk。

答案 2 :(得分:1)

我认为这就是你要找的东西:

#!/user/bin/sh
READ_FILE=/export/home/user/command_file.txt
VA1=A
VA2=B
GET_VALUE=`awk -v var1=$VA1 -v var2=$VA2 '$1==var1 && $2==var2 {print $3}' command_file.txt `
echo $GET_VALUE

答案 3 :(得分:0)

或者也许:

#!/bin/bash
grep "$1" test.txt | grep "$2" | awk '{print $3}'

如果您的vars需要处于任何一个顺序?

答案 4 :(得分:0)

修正:

#!/user/bin/sh
READ_FILE=/export/home/user/command_file.txt
VA1=A
VA2=B
GET_VALUE=`awk "/$VA1 $VA2/ "'{print $3}' < $READ_FILE`
echo $GET_VALUE

答案 5 :(得分:0)

我知道这是一个古老的帖子,但awk甚至更老,仍然在使用 - 人们仍然在寻找相同的答案。我想我就是这样的一个例子。

我决定实现类似的方案,但希望在配置文件中预定义变量。用户将配置文件的部分名称作为第一个参数传递给脚本。

cfg=$PWD/$1.cfg

foo=$(awk '$1 ~ /foo/ { print $2 }' $cfg)