2009-10-14 139 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) 
相關問題