awk里面的数组打印输出有问题

时间:2012-09-20 21:37:15

标签: arrays awk printf counter

我有一个似乎有效的脚本:我有一个包含

的文件“insert”
+004.1    
-005.2

我想在我的目录中的每个文件满足搜索模式条件时插入这些值。下面的脚本确实运行,实际上当我回显数组的部分似乎很好:

示例(查看下面的脚本):

echo ${array1[0]}  prints to +004.2 

但是当我希望将它插入到awk中时(参见下面的脚本):

printf( "%s\n",   "       Latitude (N is +)      :  """   '${array1[COUNTER]}' " ", ),

它只打印4.1,我希望打印"+004.1"

感谢任何帮助。有关更多信息,请查看下面的脚本。

#**********************************************************************
#!/bin/bash
COUNTER=0
array1=( `cat "insert"`)

for i in *.log
do

    echo  ${array1[COUNTER]} 

    cat $i | awk '{ if ( $0 ~ /Letter/ ) {
                      printf( "%s\n",  "       Latitude (N is +)      :  """   '${array1[COUNTER]}' " ", $0 );
                    } else {
                      print $0;
                    }
                  }' > out$COUNTER

    let COUNTER=COUNTER+1

done

1 个答案:

答案 0 :(得分:1)

使用printf()%+06.1f等格式。

...
printf("%s %+06.1f %s\n", " Latitude (N is +) : ", '${array1[COUNTER]}', $0);
...

我减少了字符串中的空格数,因此SO的行不会太长。

由于原始代码使用printf("%s\n", ...one string expression...)并且shell变量中的值格式正确,因此您还可以执行以下操作:

...
print " Latitude (N is +) : '${array1[COUNTER]}' " $0;
...

这将在shell中格式化的字符串嵌入到前缀为$0的字符串中,并使用print输出整个批次。


shell代码有资格获得UUOC奖励。通过命令行将变量传递给awk也是一个好主意:

awk -v latitude=${array1[COUNTER]} \
    '{ if ($0 ~ /Letter/) printf("%s %+06.1f ", " Latitude (N is +) : ", latitude);
       print $0;
     }' $i > out$COUNTER

这有点紧凑,也不容易辨认(就我的思维方式而言)。如果需要,在行开始之前输出额外信息,然后无条件地打印该行的其余部分。如图所示传递变量避免了必须破坏脚本中的单引号。

另请注意,shebang行#!/bin/bash必须是文件中的第一行才能生效。 所有明星的评论栏确实没有太大的帮助;我将它删除(他们 - 我已经删除了尾随的,但需要留下领先的一个以便能够讨论这个问题)。