【问题标题】:Convert output to arrays then extract values to loop将输出转换为数组,然后提取值以循环
【发布时间】:2015-02-13 21:57:28
【问题描述】:

我希望将输出结果 grep 到第二列和第三列:

1       db1    ADM_DAT   300     yes     95.09
2       db2    SYSAUX          400     yes     94.52

并将它们转换为数组,例如:

outputres=("db1    ADM_DAT" "db2    SYSAUX")

然后能够在循环中读取这些值,例如:

for i in "${outputres[@]}"; do read -r a b <<< "$i"; unix_command $(cat file|grep $a|awk '{print $1}') $a $b;done

文件:

10.1.1.1 db1
10.1.1.2 db2

最终预期:

unix_command 10.1.1.1 db1 ADM_DAT   
unix_command 10.1.1.2 db2 SYSAUX

这只是一个理论上的例子,我不确定它是否有效。

【问题讨论】:

  • 试试awk '{print $2,$3}' file
  • @Avinash Raj ,很好,但它们不会出现在数组中,这是仅输出结果的最简单部分,我的想法是让它们出现在数组中,而不仅仅是为了显示它们。
  • 然后:mapfile -t outputres &lt; &lt;(awk '{print $2,$3}' file).

标签: arrays bash awk


【解决方案1】:

我会使用简单的 bash while read 并继续使用 += 语法将元素添加到数组中:

outputres=()
while read -r _ a b _; do
  outputres+=("$a $b")
done < file

这样做,使用您的输入文件,我得到:

$ echo "${outputres[@]}"     #print all elements
db1 ADM_DAT db2 SYSAUX
$ echo "${outputres[0]}"     #print first one
db1 ADM_DAT
$ echo "${outputres[1]}"     #print second one
db2 SYSAUX

由于您想分别使用这两个值,因此使用关联数组可能会更好:

$ declare -A array=()
$ while read -r _ a b _; do array[$a]=$b; done < file

然后你可以循环遍历这些值:

$ for key in ${!array[@]}; do     echo "array[$key] = ${array[$key]}"; done
array[db2] = SYSAUX
array[db1] = ADM_DAT

查看使用这些数组的基本示例:

#!/bin/bash
declare -A array=([key1]='value1' [key2]='value2')

for key in ${!array[@]}; do
    echo "array[$key] = ${array[$key]}"
done

echo ${array[key1]}
echo ${array[key2]}

所以也许这可以解决您的问题:循环遍历包含列的文件,获取第二个和第三个并使用它们两次:首先 $a 在file 中执行 grep,然后作为 cmd_command 的参数:

while read -r _ a b _
do
    echo "cmd_command $(awk -v patt="$a" '$0~patt {print $1}' file) $a, $b"
done < columns_file

对于示例文件file

$ cat file
hello this is db1
and this is another db2

我得到了这个输出(注意我只是echoing):

$ while read -r _ a b _; do echo "cmd_command $(awk -v patt="$a" '$0~patt {print $1}' file) $a, $b"; done < a
cmd_command hello db1, ADM_DAT
cmd_command and db2, SYSAUX

【讨论】:

  • IFS= 是否读取了之前的输出?因为我没有将其保存到文件中,所以我想要输出,我会自动将其转入该数组 outputres
  • 那么,不用while read; do ... done &lt; file 直接管它:cat file | things | while read ... done
  • 我没有从文件中获得该信息,只是从上一个命令中简单打印出来的结果
  • @gniourf_gniourf 你是对的。检查后我添加了IFS=,我没有测试它。已更新,谢谢!
  • @KalinBorisov 的编辑很有帮助。请参阅我的最后一次编辑并提供完整答案。它在底部
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多