我有一个似乎有效的脚本:我有一个包含
的文件“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
答案 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
必须是文件中的第一行才能生效。
所有明星的评论栏确实没有太大的帮助;我将它删除(他们 - 我已经删除了尾随的,但需要留下领先的一个以便能够讨论这个问题)。