【问题标题】:Difficulties with awk scriptingawk 脚本的难点
【发布时间】:2012-02-21 22:00:36
【问题描述】:

大家好,我在 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 语句得到任何输出。关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: bash unix awk sh


    【解决方案1】:

    在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】:

      或者你也可以使用一个衬垫

      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】:
        # 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】:

          这是一个错字,还是您遗漏了文件名作为 awk 的输入?

          edit 好的,现在来自 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
          

          我希望这会有所帮助。

          【讨论】:

          • cd Halls for filename in $2 do echo "Subsidiary=$2 Family Name=$1" fname=$1 awk -F, '$1 ~ /$fname/{print $1 " has a salary of " $3}' $filename done我已经输入了这个并且不断出错!
          • @methuselah :见编辑。将来,编辑您的问题以包含您正在运行的代码和您收到的错误消息。祝你好运!
          • methuselah :感谢接受复选标记,但我很确定@Kevin 最初在他的帖子中是正确的。我有第一个答案,但我肯定错过了我的第一个答案版本中的'"$"'。 (直到我修复了我的答案之后,我才注意到他的第二个答案与我的固定答案几乎相同)。请恢复 chk-mark 给 Kevin。祝大家好运!
          【解决方案5】:

          试试这个,希望我做对了你的任务:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-11
            • 1970-01-01
            • 1970-01-01
            • 2012-05-24
            • 1970-01-01
            • 2013-08-21
            • 2013-08-17
            • 1970-01-01
            相关资源
            最近更新 更多