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
在第一次运行时返回分隔符之前的行,在第二次运行时返回分隔符之后的行,并执行两个单独的任务。