Использование awk для поиска в таблице - PullRequest
4 голосов
/ 08 декабря 2010

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

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

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

Есть идеи, как мне это сделать с помощью awk?

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

Всего наилучшего, Alberto

Ответы [ 4 ]

5 голосов
/ 08 декабря 2010

Вы можете сделать это в чистом 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
5 голосов
/ 08 декабря 2010

Примерно так будет работать:

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

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

0 голосов
/ 08 декабря 2010

Я думаю, что grep на самом деле лучше подходит:

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

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

0 голосов
/ 08 декабря 2010
TEXT=`grep value file | cut -f1`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...