2015-12-03 2 views
0

У меня есть следующее заявление AWK в скрипте:AWK не работает в Bash Script

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

При запуске сценария, выход является пустым. Однако, если я запускаю следующее:

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 находится в одинарных кавычках. Переменные оболочки не расширяются, когда они находятся внутри кодовых слов. Поэтому вам нужно использовать -v, чтобы назначить их переменной awk. –

+1

В любом случае, не отправляйте результаты grep в awk. awk сам может фильтровать по regex – hek2mgl

ответ

2

Если новый для любой утилиты * NIX, вы можете увидеть основные документы, используя «человек utility_name»; от страницы человека для «AWK» (человек AWK):

-v переменная = значение
Присвоить значение Вэл переменной Var, до начала выполнения программы. Такие значения переменных доступны для блока BEGIN программы AWK.

Есть другие способы сделать это, но после Документов ваш код будет изменен на что-то вроде:

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 внутри скрипта и трубопровода, который через awk отображает все города. Если я запускаю ту же самую команду из сценария и непосредственно в терминал, это работает ... Любые идеи? –

+0

удалите '$ DATAFILE' из командной строки awk; «pipe» (match) из grep отправляется непосредственно на «awk» - «awk» будет печатать все в файле, если вы включаете имя файла ... [он игнорирует данные из «pipe»] ... –

0

Я не могу пока комментировать благодаря репутации. Другая вещь, которую вы можете сделать, - это избежать одиночных кавычек вокруг имен переменных. Если у вас все еще возникают проблемы со всеми появляющимися городами, я считаю, что это потому, что вы поставляете awk с именем файла. Похоже, вам нужно это сделать, и пусть выход grep будет использоваться в качестве входа для вашего awk. У меня нет доступа к моей коробке Линукса, чтобы проверить это, но:

вашей линии (то, $ 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, избегая одинарных кавычек. IGNORECASE awk должна быть заменой для grep -E.

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

Как я уже сказал, не могу проверить его для синтаксиса на данный момент; Надеюсь, это поможет вам.

Счастливый взлом!

Смежные вопросы