amp*_*ent 7 scripting bash awk
我正在尝试awk
在bash
脚本内部使用并执行一项相当常见的任务:迭代结构良好的文件行并通过分隔符将它们拆分为数组。这是文件中的一个示例:
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 范围之外定义的数组),我应该怎么做?
我认为你可以在没有 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
如上所述,删除 的一个附带好处是,您在循环中创建的任何变量在循环完成后都将继续存在。
这应该有效:
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)