awk - поиск нескольких аргументов командной строки в текстовом файле - PullRequest
0 голосов
/ 16 ноября 2018

Итак, у меня есть файл data.dat, который содержит данные о недвижимости, разделенные знаком ';' (в каком районе они расположены, площадь, цена и краткое описание).

Например:

13;78;44;garage, balcony, multiple floors  
23;100;25;garden, alarm system, unfurnished  
16;97;60;balcony, unfurnished, alarm system  

Я пишу сценарий оболочки, в котором перечислены квартиры, которые соответствуют критериям поиска, заданным в аргументах командной строки. Например, если я запускаю программу так:

bash real.sh -search alarm system unfurnished

Вывод должен быть:

23;100;25;garden, alarm system, unfurnished  
16;97;60;balcony, unfurnished, alarm system 

У меня есть следующий код, который может проверять первое слово после -search:

if test "$1" = "-search"
   then awk -v word="$2" 'BEGIN{FS=";"} {if ($4 ~ word) {print $0}}' data.dat;
   exit 1;
fi

Но мне нужна эта программа, чтобы иметь возможность проверять любое количество слов после поиска. Как я мог это сделать? Я попытался использовать регулярное выражение "$ {@: 2}" вместо "$ 2", но это не сработало.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Как вы прокомментировали, вы хотите точно foo bar вместо foo or bar, тогда вы можете изменить формат аргумента, например, чтобы они разделялись запятыми: foo bar,blah, это поиск foo bar и blah. В противном случае вы не сможете различить foo[space]bar или foo or bar. Таким образом, вы можете сделать:

awk -F';' -v p="alarm system,unfurnished" 'BEGIN{gsub(",","|",p)} $4~p' file

Конечно, вы можете позволить переменной p назначаться переменной оболочки:

awk -F';' -v p="$search" 'BEGIN{....
0 голосов
/ 02 июля 2019

Вам нужно решение awk?

$ cat patterns
alarm
system
furnished

$ egrep -f patterns file
23;100;25;garden, alarm system, unfurnished  
16;97;60;balcony, unfurnished, alarm system  
0 голосов
/ 16 ноября 2018

поиск всех слов независимо от порядка в четвертом поле

$ awk -F';' -v words="alarm system unfurnished" '
             BEGIN {n=split(words,ks," ")} 
                   {for(i=1;i<=n;i++) if($4!~ks[i]) next}1' file

23;100;25;garden, alarm system, unfurnished  
16;97;60;balcony, unfurnished, alarm system

если вы ищете какое-либо из найденных слов, измените последнюю часть на

... if($4~ks[i]) {print; next}}' file

notубедитесь, какой из них вам нужен, так как в примере нет случая частичного совпадения.

, если вы хотите использовать пользовательский ввод, сразу измените значение на

... words="${*:2}" ...

, оставив остальное таким же.Тем не менее, не ясно, что вы ищете все подходящие слова или любое другое.

...