【问题标题】:bash + awk : looping over an array of 4 elements that returns size of 1?bash + awk:循环返回大小为 1 的 4 个元素的数组?
【发布时间】:2013-02-26 09:34:51
【问题描述】:

我有以下脚本,它使用 awk 将字段与用户输入进行匹配

NB=$#
FILE=myfile

#GET INPUT
if [ $NB -eq 1 ]
then
    A=`awk -F "\t" -v town="$1" 'tolower($3) ~ tolower(town) {print NR}' $FILE`
fi

如果我打印输出,它会显示:

7188 24369 77205 101441

这是我所期望的。然后,如果我执行以下操作:

IFS=' '
array=($A)
echo ${#array[@]}

我实际上得到的长度是 1 (?)。此外,如果我尝试:

for x in $array
do
    echo $x
done

它实际上打印出来了:

7188
24369
77205
101441

如何让它返回 4 的长度。如果只有 1 个元素,我不明白 for...in 是如何工作的?

编辑:

echo $A | od -c 在我创建数组之前是:

0000000   7   1   8   8       2   4   3   6   9       7   7   2   0   5
0000020       1   0   1   4   4   1  \n
0000030

echo $A | od -c 创建数组后是:

0000000   7   1   8   8  \n   2   4   3   6   9  \n   7   7   2   0   5
0000020  \n   1   0   1   4   4   1  \n
0000030

【问题讨论】:

  • 你设置IFS=' '有什么原因吗?默认值应该对您有用,因为它已经包含换行符。
  • 我想我使用不同的代码从 awk 渲染到数组。但你是对的,它现在似乎工作了......叹息。我以为我的值之间有空格,所以我希望分隔符 100% 正确。

标签: arrays bash loops awk


【解决方案1】:

这是因为 awk 返回的输出是换行符 (\n) 分隔的,而不是空格分隔的。因此,如果您有这样的 IFS:

IFS=$'\n' # newline between quotes

然后它会像你期望的那样回显array length = 4

【讨论】:

  • 我编辑了它,仍然回显 1。另外,如果长度仍然只有 1,循环如何打印出 4 个元素?我还尝试使用tr 来形成我的数组(类似于array=( $(echo $A | tr " " "\n") )),但没有成功。
  • 第一件事是你需要运行一个循环来遍历这样的数组:for x in ${array[@]} 不像你写的那样。第二件事你能显示echo $A | od -c的输出吗?
  • 当然!将输出添加到问题本身(用于格式化)。
  • 看起来您的字符串$A 中有\n。你可以试试IFS=$'\n'
猜你喜欢
  • 2018-12-08
  • 2020-12-28
  • 2013-05-17
  • 2019-11-13
  • 2018-03-14
  • 2014-10-16
  • 2016-04-21
  • 2021-02-23
  • 1970-01-01
相关资源
最近更新 更多