Bash脚本没有看到使用Awk创建的数组

Ben*_*nto 1 variables bash scripting awk scope

我希望在常规文件的每一行中都能获得一部分.为此我在脚本中使用了awk程序.我需要将每个部分放在一个数组中.像这样的东西有效:

declare -i j=1
awk 'BEGIN { FS="|" } { a[j]=$6; ((j++)) }' myFile
Run Code Online (Sandbox Code Playgroud)

但是我在脚本中遇到问题,当我需要使用数组时.实际上,awk块中的数组不会被脚本的其余行看到 - 该块之外的行.怎样才能解决这个问题?

mkl*_*nt0 5

正如汤姆·费内奇(Tom Fenech)所指出的那样,shell代码和awk脚本是独立的世界,各自的变量彼此无关.
(更一般地说,任何外部实用程序都在进程中运行,因此无法修改调用shell的环境.)

为了读取awk输出到一个bash数组,你必须阅读awk标准输出输出.

在Bash v4 +中,您可以执行以下操作:

readarray -t a < <(awk 'BEGIN { FS="|" } { print $6 }' myFile)
Run Code Online (Sandbox Code Playgroud)

"${a[@]}"将从awk'sdout输出中的各个行创建Bash数组.

请注意使用进程substitution(<(...))readlinevia stdin(<)提供输入,这确保了数组保留在脚本的其余部分的范围内.