将数据提取到数组中

时间:2019-05-05 09:25:19

标签: arrays bash

我的文件如下:

-bash-4.2$ cat a1.txt
0        10.95.187.87  5444  up      0.333333   primary  0           false  0            
1        10.95.187.88  5444  up      0.333333   standby  1           true   0            
2        10.95.187.89  5444  up      0.333333   standby  0           false  0

我想从上述文件中提取数据到2D数组中。 您能否以合适的方式帮助我放入数组。 同样在推杆后,我们需要放置条件以检查第4列中的值是UP还是DOWN。如果为UP,则表示正常,如果为DOWN,则需要执行以下命令。

-bash-4.2$ pcp_attach_node -w -U pcpuser -h localhost -p 9898 0

(末尾的值是从第一列获取的。

2 个答案:

答案 0 :(得分:0)

您可以尝试类似的操作:

while read -r line; do
  declare -a array=( $line ) # use IFS
  echo "${array[0]}"
  echo "${array[1]}" # and so on
  if [[ "$array[3]" ]]; then 
    echo execute command...
  fi
done < a1.txt

或者:

while read -r -a array; do
  if [[ "$array[3]" ]]; then 
    echo execute command...
  fi
done < a1.txt

这仅在字段之间用空格分隔(任何类型的空格)时有效。

如果需要更精确地控制格式,则可以将其与regexp混合使用。

答案 1 :(得分:0)

首先,我认为bash中不能包含2D数组。但是,您可以将线存储到一维数组中。

这是一个脚本parse1a.sh,用于演示针对所包含的数据类型的2D数组的仿真:

#!/bin/bash

function get_element ()  {
  line=${ARRAY[$1]}
  echo $line | awk "{print \$$(($2+1))}" #+1 since awk is one-based
}

function set_element ()  {
  line=${ARRAY[$1]}
  declare -a SUBARRAY=($line)
  SUBARRAY[$(($2))]=$3
  ARRAY[$1]="${SUBARRAY[@]}"
}

ARRAY=()
while IFS='' read -r line ||  [[ -n "$line" ]]; do
    #echo $line
    ARRAY+=("$line")
done < "$1"

echo "Full array contents printout:"
printf "%s\n" "${ARRAY[@]}" # Full array contents printout.

for line in "${ARRAY[@]}"; do
    #echo $line
    if [ "$(echo $line | awk '{print $4}')" == "down" ]; then
        echo "Replace this with what to do for down"
    else
        echo "...and any action for up - if required"
    fi
done

echo "Element access of [2,3]:"
echo "get_element 2 3 : "
get_element 2 3
echo "set_element 2 3 left: "
set_element 2 3 left
echo "get_element 2 3 : "
get_element 2 3

echo "Full array contents printout:"
printf "%s\n" "${ARRAY[@]}" # Full array contents printout.

它可以通过以下方式执行:

./parsea1 a1.txt

希望这很接近您要寻找的东西。请注意,这段代码会在处理过程中失去所有缩进空间,但是对行进行格式化更新可以解决该问题。