использование gawk в сценарии оболочки - PullRequest
0 голосов
/ 14 сентября 2009

Я хочу сделать что-то в этом роде:

for i in 1 2 3
do
   gawk '{if ($i==$2) {print $0;}}' filename
done

это возможно?

спасибо

Ответы [ 4 ]

3 голосов
/ 14 сентября 2009

Чтобы избежать неприятных кавычек, вы можете использовать функцию передачи переменных gawk:

for i in 1 2 3
do
    gawk -v param=$i '{if (param==$2) {print $0}}' filename
done
1 голос
/ 14 сентября 2009

Предполагая, что вы хотите, чтобы скрипт gawk был

{if ($1 == $2 ) ... }
{if ($2 == $2 ) ... }
{if ($3 == $2 ) ... }

Вы можете сделать:

for i in 1 2 3
do
   gawk '{if ($'$i'==$2) {print $0;}}' filename
done
0 голосов
/ 14 сентября 2009

На ум приходят две возможные интерпретации вашего сценария:

  1. Вы действительно хотите найти «1», «2», а затем «3» как второе поле в filename
  2. Вы действительно хотите найти первый параметр сценария оболочки, затем второй, ...

Вот обе версии цикла:

for i in 1 2 3; do 
   gawk "{if (\"$i\"==\$2) {print \$0;}}" filename
done
for i in "$@"; do
   gawk "{if (\"$i\"==\$2) {print \$0;}}" filename
done
0 голосов
/ 14 сентября 2009

Ну, конечно, это возможно, но, вероятно, не будет делать то, что вы хотите.

... если подумать, что делать вы хотите, чтобы он делал? Это не совсем понятно из того, что вы написали. Одна вещь, которую вам, вероятно, придется изменить, это заменить одинарные кавычки на двойные, потому что переменные (например, $i) не подставляются в одинарные кавычки.

...