【问题标题】:Building array from awk output从 awk 输出构建数组
【发布时间】:2020-04-14 07:51:06
【问题描述】:

谁能解释一下为什么以下不起作用?

列表

the letter is d
the number is 4
the number is 2
the letter is g

脚本.sh

#!/bin/bash

cat "$1" | grep letter | array=($(awk '{print $4}'))

for i in "${array[@]}"
do
  :
  echo $i
done

如果我运行此bash script.sh list,我希望数组打印 d 和 g,但事实并非如此。我认为这是因为我试图设置数组。

【问题讨论】:

    标签: arrays linux bash awk cat


    【解决方案1】:

    我认为这是因为我尝试设置数组的方式。

    管道| 中的每个命令都在子shell 中运行——作为一个单独的进程。父进程不会“看到”子进程的变量更改。

    只是:

    array=($(grep letter "$1" | awk '{print $4}'))
    

    array=($(awk '/letter/{print $4}' "$1"))
    

    在父 shell 中运行变量赋值。

    【讨论】:

    • 好的,谢谢。我使用了最上面的,但你错过了一个“)”。效果很好。
    【解决方案2】:

    您应该将完整的管道命令行分配给一个变量。

    array=($(cat "$1" | grep letter | awk '{print $4}'))
    

    catgrep 命令可以与awk 组合使用,但是为什么要一个数组呢?
    我认为您希望在一个循环中处理每个元素,因此首先删除双引号:

    for i in ${array[@]}
    do
      :
      echo $i
    done
    

    接下来,尝试在没有数组的情况下执行此操作

    while read -r i; do
      :
      echo $i
    done < <(awk '/letter/ {print $4}' "$1")
    

    【讨论】:

    • 你说的太对了。我想这样做,但我从复制问题开始。已更正。
    猜你喜欢
    • 2020-01-15
    • 2011-05-02
    • 2014-12-31
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多