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

Bash 使用shell脚本将列表中由分隔符分隔的部分读入数组,bash,shell,awk,sed,ksh,Bash,Shell,Awk,Sed,Ksh,我有一个命令,它以以下模式输出 red yellow blue green -------- black brown pink 我想将“---”之前的列表读入一个数组,将另一半读入另一个数组 我知道这可以通过循环来实现。但我也认为,使用SED或AWK可以非常优雅地实现这一点,问题是我不知道如何实现。我真的非常感谢你在这方面的帮助。我很有信心这是可能的,但如果我错了,或者有更好/更聪明的方法,请告诉我。从将整个列表读入一个数组开始 首先,将整个列表读入一个数组 你能试试这个吗 awk 'BEGI

我有一个命令,它以以下模式输出

red
yellow
blue
green
--------
black
brown
pink
我想将“---”之前的列表读入一个数组,将另一半读入另一个数组


我知道这可以通过循环来实现。但我也认为,使用SED或AWK可以非常优雅地实现这一点,问题是我不知道如何实现。我真的非常感谢你在这方面的帮助。我很有信心这是可能的,但如果我错了,或者有更好/更聪明的方法,请告诉我。

从将整个列表读入一个数组开始


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

你能试试这个吗

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]是底部。你能试试这个吗

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]是顶部。
[2]是底部部分。

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

#!/bin/bash
declare -a array1=()
while IFS= read -r line ; do
  [[ $line != "--------" ]] || break
  array1+=("$line")
done
readarray -t array2
它需要在中接收其对标准的输入。将其放在脚本中(例如split_array),使其可执行,并按如下方式调用:

./split_arrays < <(command)
$cat txt
red
yellow
blue
green
--------
black
brown
pink

/split_array<此解决方案将逐行读取,直到找到分隔符,将每行附加到第一个数组,然后使用一个命令创建第二个数组

#!/bin/bash
declare -a array1=()
while IFS= read -r line ; do
  [[ $line != "--------" ]] || break
  array1+=("$line")
done
readarray -t array2
它需要在中接收其对标准的输入。将其放在脚本中(例如split_array),使其可执行,并按如下方式调用:

./split_arrays < <(command)
$cat txt
red
yellow
blue
green
--------
black
brown
pink

/split\u array<我在寻找一个更像这样的答案:

./split_arrays < <(command)
$cat txt
red
yellow
blue
green
--------
black
brown
pink
然后:


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

./split_arrays < <(command)
$cat txt
red
yellow
blue
green
--------
black
brown
pink
然后:


您实际上不需要任何类型的循环来处理文件。 这两个命令将实现以下目的:

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)    

readarray-t first<处理文件实际上不需要任何类型的循环。
这两个命令将实现以下目的:

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)    

readarray-t first<如果您的文件是此文件

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

如果您的文件是这样的

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

发布您的尝试以及您被阻止的位置。此外,这不是一种简单的方法,只有在您没有其他方法可以使用原始命令控制时,才可以这样发布命令输出。我想了解更多有关此问题的来源的信息。您的实际用例是什么?我们能确认一下(一旦你问了一个真实的问题)它不是一个数组吗?我知道你想创建一个Bash数组。除了读取它们的输出外,不能使用
awk
sed
创建Bash数组。如果要将它们的输出拆分为两个数组,则仍然需要逐行读取它们的输出以检测分隔线,而不管您打算如何创建数组。您的最佳解决方案可能涉及某种循环或逐行分析。我需要对我之前的评论进行限定:您可以通过读取输入两次,并使用
sed
/
awk
在第一次运行时返回分隔符之前的行,在第二次运行时返回分隔符之后的行,并执行两个单独的任务。发布您的尝试和被阻止的位置。此外,这不是一种简单的方法,只有在您没有其他方法可以使用原始命令控制时,才可以这样发布命令输出。我想了解更多有关此问题的来源的信息。您的实际用例是什么?我们能确认一下(一旦你问了一个真实的问题)它不是一个数组吗?我知道你想创建一个Bash数组。除了读取它们的输出外,不能使用
awk
sed
创建Bash数组。如果要将它们的输出拆分为两个数组,则仍然需要逐行读取它们的输出以检测分隔线,而不管您打算如何创建数组。您的最佳解决方案可能涉及某种循环或逐行分析。我需要对我之前的评论进行限定:您可以通过读取输入两次,并使用
sed
/
awk
在第一次运行时返回分隔符之前的行,在第二次运行时返回分隔符之后的行,并执行两个单独的任务。