使用shell脚本将由分隔符分隔的列表的pariticular部分读入数组

时间:2017-02-10 13:05:16

标签: bash shell awk sed ksh

我有一个以下列模式输出的命令

$provider = '\MyBundle\Classes\Provider\Dropbox';
$token = new $provider;

我想将“----”之前的列表读入一个数组,将另一半读入另一个数组。

我知道这可以使用循环来完成。但我认为这可以通过使用SED或AWK非常优雅地完成,问题是我不知道如何。我真的很感激任何帮助。我非常有信心这是可能的,但如果我错了或者有更好/更聪明的方式,请告诉我。

6 个答案:

答案 0 :(得分:3)

首先将整个列表读入一个数组。

readarray -t tmp < <(yourCommand)

然后搜索分隔符。

for ((i=0; i<${#tmp[@]}; i++)); do
    if [[ ${tmp[i]} == "--------" ]]; then
        break
    fi
done

然后使用子串扩展将数组拆分为两部分。请注意,如果找不到分隔符,则每个元素都会进入onetwo为空。

one=("${tmp[@]:0:i}")
two=("${tmp[@]:i+1}")

答案 1 :(得分:1)

我正在寻找更像这样的答案:

$cat txt
red
yellow
blue
green
--------
black
brown
pink

然后:

array=$(cat txt | awk '{ if ($1~/----/) exit; else {print $1}}')
echo $array

red
yellow
blue
green

答案 2 :(得分:1)

如果您的文件是

red
yellow
blue
green
--------
black
brown
pink  

然后你可以:

 $ array=$(cat file | grep -v - | tr '\n' ' ')
 $
 $ echo $array
 $ red yellow blue green black brown pink
 $
 $ echo ${array:0:21}
 $ red yellow blue green
 $
 $ echo ${array:22:-1}
 $ black brown pink

答案 3 :(得分:0)

你能试试吗?

awk 'BEGIN {RS="" } {s=$i" "s } END { split(s,a,"--------"); print a [1],a[2]  } ' d

red
yellow
blue
green

black
brown
pink

a [1]是顶部。 a [2]是底部。

答案 4 :(得分:0)

此解决方案将逐行读取,直到分隔符,将每行附加到第一个数组,并使用一个命令创建第二个数组。

#!/bin/bash
declare -a array1=()
while IFS= read -r line ; do
  [[ $line != "--------" ]] || break
  array1+=("$line")
done
readarray -t array2

它需要在标准输入中接收它的输入。将它放在一个脚本(比如split_arrays)中,使其可执行,并像这样调用它:

./split_arrays < <(command)

或者:

./split_arrays <data_file

答案 5 :(得分:0)

您实际上不需要任何类型的循环来处理文件。 这两个命令可以解决这个问题:

sed -n '1,/-----/!p' a.txt #Will exclude 1st line up to pattern, excluding also the line with pattern = last part of your file
sed -n '/-----/,$!p' a.txt #Will exclude pattern line up to last line excluding also the line with pattern = first part of your file

然后,您可以使用readarray技术将它们分配给不同的数组:

readarray -t first < <(sed -n '/-----/,$!p' a.txt)
readarray -t second < <(sed -n '1,/-----/!p' a.txt)