将输出转换为数组然后将值提取到循环

时间:2015-02-13 12:44:59

标签: arrays bash awk

我希望输出结果为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

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

1 个答案:

答案 0 :(得分:2)

我会使用一个简单的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然后作为{{1的参数}}:

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 ing):

echo