没有在awk中获取数组值

时间:2017-08-29 02:11:07

标签: bash shell awk sed string-comparison

我想将包含testfile.ps的所有其他内容的数组值插入到result.ps文件中,但是数组值没有打印出来,请帮忙。 我的要求是每次条件都满足数组下一个索引值应该与testfile.ps的其他内容一起打印到result.ps

实际上arr [0]和arr [1]在我的项目中是大字符串但是为了简单起见我正在编辑它

#!/bin/bash
a[0]=""lineto""\n""stroke""
a[1]=""476.00"" ""26.00""

awk '{ if($1 == "(Page" ){for (i=0; i<2; i++){print $arr[i]; print $0; }} 
else print }' testfile.ps > result.ps

testfile.ps

(Page 1 of 2 )
move
(Page 1 of 3 )
"gsave""\n""2.00"" ""setlinewidth""\n"

result.ps应该是

(Page 1 of 2 )
lineto
stroke
move
(Page 1 of 3 )
476.00 26.00
gsave
2.00
setlinewidth

表示一旦满足第二时间条件,数组索引应递增为1并且应该打印[1]

我也应用了这个approch,只有单个数组元素但没有得到任何输出

awk -v "a0=$a[0]" 'BEGIN {a[0]=""lineto""stroke""; if($1 == "move" ){for (i in a){ print a0;print $0; }} else print }' testfile.txt

编辑: 嗨,我已经在一定程度上解决了这个问题但是在一个地方停留了,我怎么能比较两个字符串,如&#34; a = 476.00 1.00 lineto \ nstroke \ ngrestore \ n&#34;并且&#34; b = 26.00 moveto \ n368.00 1.00 lineto \ n&#34;在awk命令中,我正在尝试

awk -v "a=476.00 1.00 lineto\nstroke\ngrestore\n" -v "b=26.00 moveto\n368.00 1.00 lineto\n"  -v "i=$a" '{
if ($1 == "(Page" && ($2%2==0 || $2==1) && $3 == "of"){  
    print i; 
    if [ i == a ];then
        i=b; print $0;  
    fi 
else if [ i == b ];then 
        i=c; print $0;  
    fi
else print $0; 
}'testfile.txt

2 个答案:

答案 0 :(得分:0)

您正在awk程序中使用一个永远不会初始化的变量arr

在您的情况下,您希望将变量从shell传递给awk。来自awk手册页:

   -v var=val
   --assign var=val
          Assign the value val to the variable var, before execution of the program  begins.   Such
          variable values are available to the BEGIN rule of an AWK program.

因此,你需要像

这样的东西
awk -v "a0=$a[0]" -v "a1=$a[1]" .....

在BEGIN块中,您可以以任何方式从变量a0和a1设置数组arr

答案 1 :(得分:0)

使用分隔符将数据收集到单个var:

$ awk -v s="lineto\nstroke;476.00 26.00" '  # ; as separator
BEGIN{ n=split(s,a,";") }                   # split s var to a array
1                                           # output record
/\(Page/ && i<n { print a[++i] }            # if (Page and still data in a
' file
(Page 1 of 2 )
lineto
stroke
move
(Page 1 of 3 )
476.00 26.00
"gsave""\n""2.00"" ""setlinewidth""\n"