2012-04-29 3 views
4

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

Я пытался что-то вдоль линий:

grep $fileName | awk '{if ($'$columnNumber' == '$searchTerm') print $0;}'

Но это не работает. Я на правильных линиях? Спасибо за любую помощь!

ответ

2

Опция -v может использоваться для передачи переменных оболочки в команду awk.

Следующая может быть то, что вы ищете:

awk -v s=$SEARCH -v c=$COLUMN '$c == s { print $0 }' file.txt

EDIT:

Я всегда стараюсь писать более элегантный и туже код. Итак, вот что значит Деннис:

awk -v s="$search" -v c="$column" '$c == s { print $0 }' file.txt

+0

Woooo! Это сработало, спасибо большое xxxxxxx –

+0

Спасибо :-) Рад я мог бы помочь – Steve

+0

@ user1136076: Я рекомендую цитировать эти переменные оболочки. –

0

Выглядит достаточно разумно. Попробуйте использовать set -x, чтобы посмотреть, что именно передается awk. Вы можете также использовать различные и/или более AWK вещи, в том числе, избавившись от отдельного Grep:

awk -v colnum=$columnNumber -v require="$searchTerm" 
    "/$fileName/ { if (\$colnum == require) print }" 

, который работает путем установки AWK переменных (colnum и require, в данном случае), а затем с помощью символьной строки $colnum в получите желаемое поле и переменную require, чтобы получить требуемую строку.

Обратите внимание, что во всех случаях (с или без команды grep), любое регулярное выражение мета-символы в $fileName будут мета-у, например, this.that будет соответствовать файл с именем this.that, но и файл с именем thisXthat.

+1

Вы используете как '-V' переменная преходящие и заливали оболочки переменные. Я рекомендую вам использовать только передачу переменных, использовать одинарные кавычки для внешнего набора и избегать отвлекающих экранов. Вы также должны указывать * все * переменные оболочки при использовании '-v'. Если вы соответствуете переменной, вам нужно будет использовать оператор match вместо косой черты. Вот пересмотренная версия вашего ответа: 'awk -v colnum =" $ columnNumber "-v require =" $ searchTerm "-v file =" $ fileName "'$ 0 ~ file && $ colnum == require''. Обратите внимание, что подразумевается 'print'. –

+0

@DennisWilliamson: Да, я был немного ленив в отношении номера столбца, цитирующего, так как он должен быть номером в первую очередь. Обратите внимание, что '$ 0 ~ var' не работает в старом awk, хотя, например, SunOS: '$ awk '$ 0 ~" pattern "'' дает: 'awk: синтаксическая ошибка около строки 1'. Если вам не нужно иметь дело с древним awk, используйте версию с переменной переменной. – torek