2015-12-03 148 views
0

我有一個腳本以下AWK語句工作。但是,如果我運行以下操作:AWK不bash腳本

grep -E Toronto listing.dat | awk -F "[\t]+" '($3 >= 2) && ($4 >= 500) && ($5 <= 900000) && ($6 <= 10)' listing.dat | sort -nk4 | less 

它按預期輸出。

我不知道爲什麼會發生這種情況,我甚至已經替換了腳本中的awk語句來回顯變量以確保它們正確傳遞並且它們是。

這是迄今爲止該腳本:

#!/bin/bash 

    DATFILE=listing.dat 

    if [ -f ${DATFILE} ]; 
    then 

      echo -n "Are you looking into anywhere in the GTA, or a specific city?: " 
      read uinput 

      if [ $uinput == "anywhere" ]; 
      then 
        echo "You have chosen anywhere" 
      elif [ $uinput == "specific" ]; 
      then 
        echo -n "Which city?: " 
        read city 

        echo -n "Minimum Number of Bedrooms: " 
        read minbed 

        echo -n "Minimum Square Footage (500, 600, etc): " 
        read minsqft 

        echo -n "Maximum Price: " 
        read maxprice 

        echo -n "Maximum Weeks On Market: " 
        read maxweeks 

        echo -n "Sort by (price, sqrft, weeks): " 
        read sortby 

        if [ $sortby == "price" ]; 
        then 
          echo -n "Sort by (asc, desc): " 
          read ascdesc 
          if [ $ascdesc == "asc" ]; 
          then 
            grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE | sort -nk5 | less 
         elif [ $ascdesc == "desc" ]; 
         then 
           grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE | sort -rnk5 | less 
         fi 
       fi 

     fi 

else 
     echo "${DATFILE} Not found!" 
fi 

能否請你幫忙嗎?

感謝

+1

'gawk'或'awk'?你的例子中都有。 – miken32

+3

您的awk腳本使用單引號。當它們位於引號引號內時,Shell變量不會被展開。所以您需要使用-v將它們分配給awk變量。 –

+1

無論如何,請勿將grep結果傳遞給awk。 awk本身能夠通過正則表達式來過濾 – hek2mgl

回答

2

如果新來的任何* nix的工具,你可以看到使用'人utility_name的基本文檔;從手冊頁 'AWK'(人AWK):

-v VAR = VAL
分配值VAL到變量var中,程序的執行開始之前。這些變量值可用於AWK程序的BEGIN塊 。

還有其他的方法可以做到這一點,但遵照docs您的代碼將改爲類似:

awk -F "[\t]+" \ 
    -v MINBED=$minbed -v MINSQFT=$minsqft -v MAXPRICE=$maxprice -v MAXWEEKS=$maxweeks \ 
    '($3 >= MINBED) && ($4 >= MINSQFT) && ($5 <= MAXPRICE) && ($6 <= MAXWEEKS)' 
+0

好吧,這是偉大的。它完美的工作,但我無法通過城市現在過濾。在腳本和管道中使用egrep,它可以顯示所有城市。如果我從腳本中直接運行相同的命令並直接進入終端,它就會起作用....任何想法? –

+0

從awk命令字符串中刪除'$ DATAFILE'; grep中的'pipe'(匹配)直接發送到'awk' - 'awk'將打印文件中的所有內容,如果包含文件名... [它忽略'pipe'中的數據] ... –

0

我不能尚未就此發表評論,由於聲譽。你可以做的另一件事是圍繞你的變量名稱單引號。如果您仍然遇到所有顯示的城市出現問題,我相信這是因爲您正在向awk提供文件名。它看起來像你需要把它拿出來,讓grep的輸出作爲awk的輸入。我沒有訪問我的Linux機器測試,但:

您的線路(已$ DATFILE提供兩次):

grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= $minbed) && ($4 >= $minsqft) && ($5 <= $maxprice) && ($6 <= $maxweeks)' $DATFILE; 

選項1:刪除第二個$ DATFILE,逃單引號

grep -E $city $DATFILE | awk -F "[\t]+" '($3 >= '$minbed') && ($4 >= '$minsqft') && ($5 <= '$maxprice') && ($6 <= '$maxweeks')'; 

選項2:您可能完全擺脫grep,使用單引號轉義。 awk的IGNORECASE應該是grep -E的替代品。

awk -F "[\t]+" 'IGNORECASE = 1;/'$city'/&&($3 >= '$minbed')&&($4 >= '$minsqft')&&($5 <= '$maxprice')&&($6 <= '$maxweeks')'; 

就像我說的,不能測試它的那一刻語法;我希望它有助於你。

快樂黑客!