2010-12-08 3 views
4

Я хотел бы использовать awk для поиска значения из текстового файла. Текстовый файл имеет очень простой формат:Использование awk для поиска таблицы

значение текста \ т
текст \ т значение
текст \ т значение
...

Я хочу передать фактический текст, для которого значение должно искать через переменную оболочки, например, $ 1.

Любые идеи, как я могу это сделать с помощью awk?

Ваша помощь очень ценится.

Все самое лучшее, Alberto

+0

Обратите внимание, что если вкладка явно разделитель полей, и если какой-либо из ваших полей может содержать пробелы, вы должны будете указать вкладку как разделитель полей: 'AWK - F '\ t' ... ' –

ответ

4

Что-то, как это будет делать работу:

#!/bin/sh 
awk -vLOOKUPVAL=$1 '$1 == LOOKUPVAL { print $2 }' < inputFile 

По сути вы установите значение подстановок передается в сценарий оболочки в $ 1 в переменную AWK, то вы можете получить доступ к этому в самом awk. Чтобы уточнить, первый $ 1 - это аргумент сценария оболочки, переданный в командной строке, второй $ 1 (и последующий $ 2) - это поля 1 и 2 входного файла.

+0

спасибо, что работает - за исключением минимальных изменений в синтаксисе: awk '$ 1 == LOOKUPVAL {print $ 2}' LOOKUPVAL = $ 1 inputFile – user534805

+0

Я бы привел $ 1 в скрипте оболочки:' awk -v "LOOKUPVAL = $ 1" ... ' –

0

Я думаю, что Grep действительно может быть лучше подходят:

$ echo "key value 
ambiguous correct 
wrong ambiguous" | grep '^ambiguous ' | awk ' { print $2 } ' 

Символ^на шаблон, чтобы соответствовать в начале строки и убедитесь, что вы не подходите линии, где значение, а чем ключ, был желаемым текстом.

+1

Я не согласен. awk вполне способен сделать это сам по себе –

4

Вы можете сделать это в чистом AWK сценария без оболочки оболочки:

#!/usr/bin/awk -f 
BEGIN { key = ARGV[1]; ARGV[1]="" } 
$1 == key { print $2 } 

Позвони это так:

./lookup.awk keyval lookupfile 

Пример:

$ cat lookupfile 
aaa  111 
bbb  222 
ccc  333 
ddd  444 
zzz  999 
mmm  888 
$ ./lookup.awk ddd lookupfile 
444 
$ ./lookup.awk zzz lookupfile 
999 

Это может быть даже расширен, чтобы выбрать нужное поле, используя аргумент.

#!/usr/bin/awk -f 
BEGIN { key = ARGV[1]; field = ARGV[2]; ARGV[1]=ARGV[2]="" } 
$1 == key { print $field } 

Пример:

$ cat lookupfile2 
aaa  111  abc 
bbb  222  def 
ccc  333  ghi 
ddd  444  jkl 
zzz  999  mno 
mmm  888  pqr 
$ ./lookupf.awk mmm 1 lookupfile2 
mmm 
$ ./lookupf.awk mmm 2 lookupfile2 
888 
$ ./lookupf.awk mmm 3 lookupfile2 
pqr 
Смежные вопросы