2009-10-14 53 views
2

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

 
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}'` 

有什么建议吗? 谢谢。

+0

你为什么不告诉我们你得到的错误;) – 2009-10-14 22:00:08

+6

谢里,你需要学习管道符'之间的区别|'和小写字母“ELL”,以及如何正确使用引号(单和双)。基本的shell教程会有所帮助。 – 2009-10-14 23:04:17

回答

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}' 

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

+0

'/^var1 var2 /'是多余的,“;”在打印每个输入行之前进行匹配(因为在分号之前没有任何操作)。 – 2009-10-15 02:11:54

+0

此外,第二次将其管道化为awk是不必要的。它可以在第一次得到它时打印该字段。 – 2009-10-15 02:21:14

+0

丹尼斯威廉姆森,谢谢。良好的捕获。我可能应该坚持我的原始与grep。无论如何,我认为这是更好的方法。 – bmb 2009-10-15 04:59:05

0

或许:

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

如果你的增值经销商需要在任何顺序?

+0

'$ 1'和'$ 2'在这个上下文中是awk字段,而不是位置参数。相关的变量是'$ VA1'和'$ VA2'。 – 2009-10-15 02:23:03

7

你必须使用awk's变量传递的awk脚本开始,以避免毛的报价,再加上解决其他问题之前:

#!/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 
+0

请注意,在echo命令中仍然存在OP缺失$的错误。 – bmb 2009-10-15 01:02:55

+0

我现在已经修好了我的和OP的。感谢指针。 – 2009-10-15 02:12:34

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 
+0

这一个可能不会工作。 – 2009-10-15 02:13:42

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 
+0

最好用'-v'传递变量,而不是用引号来玩技巧。 – 2009-10-14 23:01:48

+0

@glenn:嗯?定义“更好”?它肯定没有漂亮 – rosenfield 2009-10-15 00:21:16

+0

@rosenfield:没有必要重定向输入文件; awk接受文件名作为参数。另外,获得引用权可能会很快发生。它可能不太好,但'-v'是可靠的。出于类似的原因避免反引号也更好。 – 2009-10-15 02:19:10

0

我知道这是一个老的文章,但AWK是更老和STIL l正在使用中 - 人们仍在寻找相同的答案。我想我是一个例子。

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

cfg=$PWD/$1.cfg 

foo=$(awk '$1 ~ /foo/ { print $2 }' $cfg) 
相关问题