2015-02-09 64 views
0
for var in 1 2 3 4 5 6 7 8 9 10 
do 
echo $var 
export lower_bound=$((($var - 1) * 10)) 
echo $lower_bound 
export upper_bound=$(($var * 10)) 
echo $upper_bound 
awk '$2 >= $(($lower_bound)) && $2 < $(($upper_bound))' shubham_test.txt > file_$var.txt 
#awk -v var1="$lower_bound" -v var2="$upper_bound" '{$2 >= $var1 && $2 < $var2}' shubham_test.txt > file_$var.txt 
done 

我想根據unix中的文本文件中字段的值拆分文件。當我將硬編碼的值傳遞給caompare時,awk可以工作,但如果我傳遞用於比較的變量(upper_bound和lower_bound),則awk無法正常工作。在awk命令中的參數

我看着它,甚至替換爲以下awk命令:

awk -v var1="$lower_bound" -v var2="$upper_bound" '{$2 >= $var1 && $2 < $var2}' shubham_test.txt > file_$var.txt 

因此,它需要的參數。但是這也不起作用。誰能幫忙?

+0

用awk,把'$'想象成一個*運算符*,它返回下一個表達式給出的字段的*值*。例如,表達式'(NF-1)'返回第二個最後一個字段的編號,'$(NF-1)'返回第二個最後一個字段的值。所以'var1'是你從shell變量$ upper_bound傳入的值(假設這個值是42)。然後'$ var1'是42號字段的值。 – 2015-02-09 14:43:43

回答

1

你的第二個格式應該工作,但沒有$的變量名 - 這樣:因爲單引號的意思是UNIX shell不評估$ LOWER_BOUND變量

awk -v var1="$lower_bound" -v var2="$upper_bound" '{$2 >= var1 && $2 < var2}' shubham_test.txt 

你的第一個版本出現故障,而是將整個文字字符串傳遞給awk。如果你正在編寫shell腳本,你必須知道如何使用單引號,雙引號和後引號 - 例如看看http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm