我有一个有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}'`
有什么建议吗? 感谢。
答案 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)