bash中数组的单独元素

时间:2019-01-31 11:37:23

标签: bash

在所附的屏幕上,我有一个数组。

我需要从该数组中获取所有第三个组件。

示例(我现有的数组):

array1 = 
 ["SRV WW ZSTG HSM BlackDuck RW", "SRV WW ZSDB M204 BlackDuck RW", etc] 

结果应为:

array2 = ["HSM", "M204"]

enter image description here

  • 我需要从数组中删除所有空元素

我现在使用的代码:

FILE="$1"

index=0
while read name; do
    get_group_names_from_file[$index]="$name"
    index=$(($index+1))
done < "${FILE}"

get_group_names_from_file=("${get_group_names_from_file[@]:3}")

for ((a=0; a < ${#get_group_names_from_file[*]}; a++))
do
    echo "${get_group_names_from_file[$a]}"
done

3 个答案:

答案 0 :(得分:0)

如果只需要第三列,则可以使用cut命令(请参阅man page):

FILE="$1"

for value in `cat $FILE | cut -d ' ' -f 3`
do
    echo "3rd column is $value"
done

答案 1 :(得分:0)

我已经这样设置ARRAY1(不需要,来分隔数组中的值):

ARRAY1=("SRV WW ZSTG HSM BlackDuck RW" "SRV WW ZSDB M204 BlackDuck RW")

并以此方式提取数组值的第三部分:

for (( i=0 ; i<$(echo ${#ARRAY1[*]}) ; i++ )) ; do ARRAY2+=($(echo ${ARRAY1[$i]} | cut -d ' ' -f3)); done

(如果要使用第4个组件,请改用cut -d ' ' -f4

通过ARRAY2检查printf '%s\n' "${ARRAY2[@]}"的值


~$ ARRAY1=("SRV WW ZSTG HSM BlackDuck RW" "SRV WW ZSDB M204 BlackDuck RW")
~$ ARRAY2=() ; for (( i=0 ; i<$(echo ${#ARRAY1[*]}) ; i++ )) ; do ARRAY2+=($(echo ${ARRAY1[$i]} | cut -d ' ' -f3)); done
~$ printf '%s\n' "${ARRAY2[@]}"
~$ ZSTG
~$ ZSDB

答案 2 :(得分:0)

对我来说,这就像XY problem
您谈论数组,但您读取了一个文件。如果需要的话,我会将数据放入数组中。

如果需要数组,请将其读取为数组。

$: cat xy.dat # used the two you had in your array that I could copy/paste
SRV WW ZSTG HSM BlackDuck RW
SRV WW ZSDB M204 BlackDuck RW

$: cat xy
#! /bin/env bash

declare -a array1=() array2=()
while read -ra row
do array1+=( "${row[*]}" ) # NOTE: using * makes one string of the row; @ would separate them
   [[ -n "${row[3]}" ]] && array2+=( "${row[3]}" )
done < "$1" # don't use capital FILE.

declare -p array1 array2 # show the contents

$: xy xy.dat
declare -a array1=([0]="SRV WW ZSTG HSM BlackDuck RW" [1]="SRV WW ZSDB M204 BlackDuck RW")
declare -a array2=([0]="HSM" [1]="M204")

如果您不是特别需要数组,或者只需要第二个数组,请简化。

$: cat xy
#! /bin/env bash
while read -r one two three four five six
do [[ -n "$four" ]] && array2+=( "$four" )
done < "$1"
declare -p array2

$: xy xy.dat
declare -a array2=([0]="HSM" [1]="M204")

如果您也不特别需要array2,请在阅读时进行所需的任何解析。

祝你好运。