【问题标题】:How to write to an array the output of an awk command in UNIX?如何在 UNIX 中将 awk 命令的输出写入数组?
【发布时间】:2015-01-15 17:49:57
【问题描述】:

我有一个包含以下内容的平面文件

INDIA USA SA NZ AUS ARG GER BRA

所以一共有八列。现在我只想将那些以 A 开头的列的索引存储到一个数组中。 为此,我尝试了以下语句

awk '{for(i=1;i<=NF;i++){if($i~/^A/){set -A newArray $i}}}' testUnix.txt

当我使用

回显文件时
echo "${newArray[*]}"

它正在打印 5 6 但每当我试图获取该数组的长度时

echo ${#newArray[@]}

它的长度仅显示为 1。不应该是 2 吗? 我也试过了

awk '{y = 0;for(i=1;i<=NF;i++){if($i~/^A/){newArray[y] = $i ; y++}}}' testUnix.txt

但它也产生了相同的结果。 我错过了什么?请解释一下。我打算得到想要的输出 2。

【问题讨论】:

  • awk 和 bash 中的 newArray 是两个不同的实体。因此,当您输入 echo "${newArray[*]}" 时,您将获得 bash 数组的值
  • 不得不说——我认为这就是 Perl 或 Python 之类的东西开始发挥作用的地方。

标签: arrays bash unix awk


【解决方案1】:

不需要awk。您可以遍历元素并检查它们是否以A开头:

r="INDIA USA SA NZ AUS ARG GER BRA"
arr=()
for w in $r
do
    [[ $w == A* ]] && arr+=("$w")
done

如果你执行它,那么arr 数组包含:

$ for i in  "${arr[@]}"; do echo "$i"; done
AUS
ARG

为了确认它有两个元素,我们来数一数:

$ echo "${#arr[@]}"
2

你的方法发生了什么?

awk '{for(i=1;i<=NF;i++){if($i~/^A/){set -A newArray $i}}}' testUnix.txt

这表示set -A newArray,但它并没有真正在 bash 中定义变量,因为您在 awk 中。

【讨论】:

    【解决方案2】:

    拥有一个 bash 数组我会做什么:

    bash_arr=( $(awk '{for(i=1;i<=NF;i++){if($i~/^A/){print $i}}}' file) )
    echo "${bash_arr[@]}"
    AUS ARG
    

    实际上你甚至不需要 awk,bash 能够做正则表达式:

    for word in $(<file); do [[ $word =~ ^A ]] && basharr+=( "$word" ); done
    

    【讨论】:

    • 它的长度还是1 :(
    • ???有什么问题 ?您有 2 个搜索到的元素。不知道怎么了。索引从零开始!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2018-02-28
    • 2021-12-23
    • 2016-04-11
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多