awk脚本的困难

时间:2012-01-30 00:58:42

标签: bash unix awk sh

大家好,我在 Halls 目录中有一个名为 Halls Engines 的文件。

所以目录结构看起来像

  

大厅/大厅发动机

Halls Engines 文件包含以下信息:

  

布朗,约翰,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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

或者你也可以使用一个班轮

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 $ 

答案 2 :(得分:2)

这是一个错字,还是你把文件名作为awk的输入?

编辑好的,现在来自shell的$ 1与awk的$ 1不同。请参阅以下更改。

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

我希望这会有所帮助。

答案 3 :(得分:2)

# 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"

答案 4 :(得分:1)

试试这个,希望我的任务正确:

#!/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