2017-02-10 106 views
0

閱讀由分隔符分隔成一個數組列表的pariticular第一節具有輸出在下面模式的命令使用外殼腳本

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

我想之前閱讀列表「----」放入一個陣列,另一半放入另一個陣列。

我知道這可以使用循環完成。但我認爲這可以通過使用SED或AWK非常優雅地完成,問題是我不知道如何。我真的很感激任何幫助。我非常有信心,這是可能的,但請讓我知道,如果我錯了,還是有一個更好/更聰明的方式。

+2

發佈您的嘗試以及您被阻止的位置。 – Inian

+0

此外,這不是一個整潔的方式,只有當你沒有其他方法來控制你的原始命令時,這樣的後處理命令輸出。 – Inian

+0

我想知道更多關於這個問題的來源。你的實際用例是什麼?我們可以得到一些確認(一旦你問一個真正的問題),它不是[XY問題](http://xyproblem.info/)? – ghoti

回答

3

首先讀取整個列表爲一個數組。

readarray -t tmp < <(yourCommand) 

然後搜索分隔符。

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

然後使用substring擴展將數組分成兩部分。請注意,如果未找到分隔符,則每個元素都將進入one,而two保留爲空。

one=("${tmp[@]:0:i}") 
two=("${tmp[@]:i+1}") 
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]是底部。

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 
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 
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)  
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