我的文件如下:
-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
(末尾的值是从第一列获取的。
答案 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
希望这很接近您要寻找的东西。请注意,这段代码会在处理过程中失去所有缩进空间,但是对行进行格式化更新可以解决该问题。