我有一个以下列模式输出的命令
$provider = '\MyBundle\Classes\Provider\Dropbox';
$token = new $provider;
我想将“----”之前的列表读入一个数组,将另一半读入另一个数组。
我知道这可以使用循环来完成。但我认为这可以通过使用SED或AWK非常优雅地完成,问题是我不知道如何。我真的很感激任何帮助。我非常有信心这是可能的,但如果我错了或者有更好/更聪明的方式,请告诉我。
答案 0 :(得分:3)
首先将整个列表读入一个数组。
readarray -t tmp < <(yourCommand)
然后搜索分隔符。
for ((i=0; i<${#tmp[@]}; i++)); do
if [[ ${tmp[i]} == "--------" ]]; then
break
fi
done
然后使用子串扩展将数组拆分为两部分。请注意,如果找不到分隔符,则每个元素都会进入one
,two
为空。
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)