1

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

+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
4

1 回答 1

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

于 2012-09-21T00:17:52.957 回答