使用 awk 将行拆分为数组并在调用 shell 时使用该数组的值

amp*_*ent 7 scripting bash awk

我正在尝试awkbash脚本内部使用并执行一项相当常见的任务:迭代结构良好的文件行并通过分隔符将它们拆分为数组。这是文件中的一个示例:

Joe:Johnson:25
Sue:Miller:27
Run Code Online (Sandbox Code Playgroud)

有许多示例说明如何在交互模式下在一行中完成此操作,但是,我正在一个脚本中执行此操作,在该脚本中,我想在 bash 本身的 awk 子外壳之外使用由 awk 操作的数组:

cat ${smryfile} | while read smryline; do

    echo ${smryline}

    #now i want to split the line into array 'linearray' in awk but have it usable when i get back to bash
    echo ${smryline} | awk '{split($0,$linearray,":")}'

    varX=$linearray[2]
    echo $varX
    #do something with $varX

done
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

awk: syntax error at source line 1
 context is
     >>> {split($0,$linearray <<< ,":")}
awk: illegal statement at source line 1
Run Code Online (Sandbox Code Playgroud)

是否可以做我想做的事情(使用在 awk 范围之外定义的数组),我应该怎么做?

Joh*_*024 7

我认为你可以在没有 awk 的情况下做你想做的事:

cat "${smryfile}" | while IFS=: read first last varx
do
    echo "first='$first' last='$last' varx='$varx'"
    # do something
done
Run Code Online (Sandbox Code Playgroud)

这产生:

first='Joe' last='Johnson' varx='25'
first='Sue' last='Miller' varx='27'
Run Code Online (Sandbox Code Playgroud)

请注意,即使文件中的某些名称包含空格,此方法也将起作用。

还要注意,cat上面的使用不是必需的:

while IFS=: read first last varx
do
    echo "first='$first' last='$last' varx='$varx'"
    # do something
done <"${smryfile}"
Run Code Online (Sandbox Code Playgroud)

cat如上所述,删除 的一个附带好处是,您在循环中创建的任何变量在循环完成后都将继续存在。


gre*_*eke 6

这应该有效:

linearray=($(awk -F: '{$1=$1} 1' <<<"${smryline}"))
echo ${linearray[2]}
# output: 27
Run Code Online (Sandbox Code Playgroud)

解释:awk -F:在 上拆分输入:awk默认情况下用空格分隔修改后的输出,因此您可以直接使用 .bashrc 的输出构造一个 bash 数组awk。注意修改后的输出,因此对 的无操作调用$1=$1,否则数据将以原始形式出现。

但鉴于你的例子,为什么不提取第三列awk -F:并循环输出:

awk -F: '{print $3}' "$smryfile" | while read varX; do
    echo $varX
done
Run Code Online (Sandbox Code Playgroud)