閱讀由分隔符分隔成一個數組列表的pariticular第一節具有輸出在下面模式的命令使用外殼腳本
red
yellow
blue
green
--------
black
brown
pink
我想之前閱讀列表「----」放入一個陣列,另一半放入另一個陣列。
我知道這可以使用循環完成。但我認爲這可以通過使用SED或AWK非常優雅地完成,問題是我不知道如何。我真的很感激任何幫助。我非常有信心,這是可能的,但請讓我知道,如果我錯了,還是有一個更好/更聰明的方式。
閱讀由分隔符分隔成一個數組列表的pariticular第一節具有輸出在下面模式的命令使用外殼腳本
red
yellow
blue
green
--------
black
brown
pink
我想之前閱讀列表「----」放入一個陣列,另一半放入另一個陣列。
我知道這可以使用循環完成。但我認爲這可以通過使用SED或AWK非常優雅地完成,問題是我不知道如何。我真的很感激任何幫助。我非常有信心,這是可能的,但請讓我知道,如果我錯了,還是有一個更好/更聰明的方式。
首先讀取整個列表爲一個數組。
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}")
你可以試試嗎?
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]是底部。
此解決方案將逐行讀取直到分隔符,將每行添加到第一個數組,並使用一個命令創建第二個數組。
#!/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
我一直在尋找更多像這樣的答案:
$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
你實際上並不需要任何形式的循環來處理文件。 這兩個命令就可以了:
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)
如果你的文件應該是這樣
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
發佈您的嘗試以及您被阻止的位置。 – Inian
此外,這不是一個整潔的方式,只有當你沒有其他方法來控制你的原始命令時,這樣的後處理命令輸出。 – Inian
我想知道更多關於這個問題的來源。你的實際用例是什麼?我們可以得到一些確認(一旦你問一個真正的問題),它不是[XY問題](http://xyproblem.info/)? – ghoti