как искать значение, хранящееся в переменной, из файла с помощью awk / grep - PullRequest
0 голосов
/ 18 июня 2020

Это может быть тривиально, но я столкнулся с проблемой использования awk для простых целей, таких как печать строки в файле с помощью tcl-скрипта. У меня есть переменная var:

set var manager

sourcefile.txt:

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000

Я хочу поместить команду внутри tcl script (awk / grep), которая использует переменную var для поиска строки в исходном файле, а затем распечатать 4-й столбец строки, содержащей строку. Я не хочу искать менеджера напрямую, а использую var . Я использовал:

awk -v pat="$var"  {$2 ~ pat {print $4 }} sorcefile.txt

Но это дает мне ошибку, говоря:

awk: 'pat' argument to '-v' not in var=value form

Также внутри tcl script:

awk '/manager/ {print $4}' sourcefile.txt

дает ошибку и

awk {/manager/ {print $4}} sourcefile.txt

работает хорошо Итак, требуемый вывод:

45000
50000
47000

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

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Это позиция котировок.

$ tclsh
% set var manager
manager
+% exec awk -v pat="$var" {$2 ~ pat {print $4}} sourcefile.txt

Нет вывода. Давайте попросим оболочку echo команду awk вместо ее выполнения:

% exec echo awk -v pat="$var" {$2 == pat {print $4}} sourcefile.txt
awk -v pat="manager" $2 == pat {print $4} sourcefile.txt

Обратите внимание, как двойные кавычки являются частью шаблона?

Давайте немного сдвинем двойные кавычки :

% exec echo awk -v "pat=$var" {$2 == pat {print $4}} sourcefile.txt
awk -v pat=manager $2 == pat {print $4} sourcefile.txt

Обратите внимание, как пропали кавычки? Выполним это сейчас:

% exec awk -v "pat=$var" {$2 == pat {print $4}} sourcefile.txt
45000
50000
47000

Это относится к правилу Tcl для двойных кавычек - открывающая кавычка должна быть первым символом слова .

В первом случае переменная awk pat буквально "manager", и, поскольку ни одно из значений $ 2 не содержит кавычек, совпадений не происходит.

1 голос
/ 18 июня 2020

это можно просто сделать в tcl

set var ...
set fi [ open "file.txt" ]
set lines [split [read $fi] "\n"]
close $fi
foreach line $lines {
        set la [ split $line ]
        if { [ lindex $la 1 ] eq $var  } {
                puts [ lindex $la 3 ]
        }

}

обратите внимание, что индекс списка начинается с 0, а awk $4 '- это tcl [lindex $la 3]

...