我想将包含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
答案 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"