Трудности со скриптом на awk - PullRequest
0 голосов
/ 30 января 2012

Привет всем У меня есть файл с именем Залы Двигатели в каталоге Залы .

Итак, структура каталогов выглядит примерно так:

Залы / Залы Двигатели

Файл Залы Двигателей содержит следующую информацию:

Браун, Джон, 24000

Браун, Сьюзан, 26000

Смит, Джилл, 24000

Я пытаюсь написать скрипт, который принимает два параметра - фамилию и имя файла, которые работают не очень хорошо.

Окончательный код должен распечатать начальную строку, содержащую имя файла и фамилию, а также имя и зарплату всех лиц с указанной фамилией.

Это код, который я написал до сих пор:

cd Halls
for filename in $2
do
echo "Subsidiary=$2 Family Name=$1"
awk -F, '$1 ~/$1/{print $1 " has a salary of " $3}'
done

Вот так я бы запустил скрипт (сохраненный как ss1 ):

./ss1 Brown "Halls Engines"

Это должно что-то вернуть:

Браун имеет зарплату £ 24000

Браун имеет зарплату £ 26000

Но я не получаю выходных данных после оператора echo. Любой совет, как я могу решить эту проблему?

Ответы [ 5 ]

3 голосов
/ 30 января 2012

Или вы также можете использовать один вкладыш

grep $1 "Halls/""$2" | awk -F , '{print $1 " has a salary " $3}'

В действии:

shadyabhi@archlinux /tmp $ cat Halls/Halls\ Engines 
Brown,John,24000
Brown,Susan,26000
Smith,Jill,24000
shadyabhi@archlinux /tmp $ ./ssl.sh Brown "Halls Engines"
Brown has a salary £24000
Brown has a salary £26000
shadyabhi@archlinux /tmp $ 
3 голосов
/ 30 января 2012

В awk вам нужно определить переменную и связать ее с переменной bash.Как то так -

#!/bin/bash

name="$1"
shift

for filename in "$@"
do 
awk -v FS=',' -v gname="$name" '$1~gname{print $1 " has a salary of "$3}' "$filename"
done

Тест:

[jaypal:~/Temp] cat data
Brown,John,24000
Brown,Susan,26000
Smith,Jill,24000

[jaypal:~/Temp] cat data1
Brown,Charlie,64000
Brown,Sam,46000
Smith,Jill,24000

[jaypal:~/Temp] ./s.awk Brown data data1
Brown has a salary of 24000
Brown has a salary of 26000
Brown has a salary of 64000
Brown has a salary of 46000
2 голосов
/ 30 января 2012
# Your awk line:
#   awk -F, '$1 ~/$1/{print $1 " has a salary of " $3}'
#            ^    ^- You want this one to be interpreted, but it's single-quoted.
#            ^- Correctly not interpreted.

# Either escape the $s that awk should see:
awk -F, "\$1 ~/$1/{print \$1 " has a salary of " \$3}" "Halls/$2"

# Or change to double quotes for them.
awk -F, '$1 == "'"$1"'"{print $1 " has a salary of " $3}' "Halls/$2"
2 голосов
/ 30 января 2012

Это опечатка, или вы пропустили имя файла в качестве ввода в awk?

edit ОК, теперь $ 1 от оболочки отличается от $ 1 от awk. См. Изменения ниже.

cd Halls
for filename in $2
do
   echo "Subsidiary=$2 Family Name=$1"
   awk -F, '$1 ~ /'"$1"'/{print $1 " has a salary of " $3}' $filename
# ---------------^^^^^^^------------------------------------^^^^^^^^^^^
done

Надеюсь, это поможет.

1 голос
/ 30 января 2012

Попробуйте, надеюсь, я правильно выполнил вашу задачу:

#!/bin/bash

while read line; do
  echo "$1,$line" | awk -F, '{ if ($1 == $2) print $2 " has a salary of " $4 }'
done < $2

Я создал файл "halls_e" с этими тремя вашими записями и запустил его:

~# ./halls.sh Brown "halls_e"
Brown has a salary of 24000
Brown has a salary of 26000
~# ./halls.sh Smith "halls_e"
Smith has a salary of 24000
...