将awk命令存储匹配的模式输出行存储到数组索引中

时间:2014-03-04 09:12:40

标签: linux bash shell unix awk

我有一个文件,我在搜索2个模式,如果匹配,然后将每个匹配的行存储到数组值。 但它没有存储值

我的Shell命令

#Removing new line chars
a=`sed ':a;N;$!ba;s/\n/ /g' sample.txt`
#storing each matched pattern row by row 
while read v1; do
y[i]="$v1"
(( i++ ))
done < <(awk -F '<abc>|</abc>' '{for (i=2; i<=NF; i+=2) print $i}' <<< "$a")

输出空值:

echo ${y[0]} is empty
echo ${y[1]} is empty
echo ${y[2]} is empty

应该是

echo ${y[0]} = 1. I am here to show
echo ${y[1]} = 2. I am here to show
echo ${y[2]} = 3. I am here to show

我的文件是:sample.txt

<abc>
1. I am here to show
</abc>
<no>
</no>
<abc>
2. I am here to show
</abc>
<abc>
3. I am here to show
</abc>
<no>
</no>

2 个答案:

答案 0 :(得分:1)

我认为这可能会更容易:

#!/bin/bash
declare -a y
while read x; do
   y[i]=$x
   ((i++))
done <  <(awk '/^<abc>/   {p=1;next}
               /^<\/abc>/ {p=0;next} p' sample.txt)
echo ${y[*]}

awk中,变量p确定我们是否正在打印当前行。当我们找到<abc>时会设置它,并在找到</abc>时清除。

答案 1 :(得分:0)

我自己发现了这个问题......

变量$i已设置为某个值,因此当我执行i ++时,它将值存储到某个数组索引中。

我做了i=0然后重新执行,工作