【问题标题】:array printout inside awk has problemsawk 中的数组打印输出有问题
【发布时间】:2012-09-13 07:56:57
【问题描述】:

我有一个似乎可以工作的脚本:我有一个“插入”文件,其中包含

+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

【问题讨论】:

标签: arrays awk printf counter


【解决方案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 必须是文件中的第一行才能生效。 带有所有星星的框注释行确实没有太大帮助。我会删除它(他们 - 我已经删除了尾随的,但需要保留前导的以便能够讨论这个问题)。

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多