所以我遇到了一个过去在HP-UX上运行的AWK脚本,但已经移植到RHEL6.4 / 6.5。它可以在文件中创建标题和预告片,主脚本体处理记录格式。
我现在运行时遇到的问题是第一行的最后一个字母流到下一行的开头。然后第二行的最后两个字母流入第三行的开头,依此类推。
这是处理记录格式的脚本部分:
ls_buffer=ls_buffer $0;
while (length(ls_buffer)>99) {
if (substr(ls_buffer,65,6)=="STUFF") {
.....do some other stuff
} else {
if (substr(ls_buffer,1,1)!="\x01f" && substr(ls_buffer,1,1)!="^") {
printf "%-100s\n", substr(ls_buffer,1,100);
}
};
#----remove 1st 100 chars in string ls_buffer
ls_buffer=substr(ls_buffer,100);
}
首先看起来该文件已经拾取了一些LF,CR,FF,所以我用gsub hex替换进一步删除代码,但它结束了100行,然后重新打印了最后一个字符开始第二行。
这是一些示例测试输出,以防它有用:
1234567890123456789012345678901 00000012345TESTS SUNDRY PAYME130 DE TESTLLAND GROUP
P1234567890123456789012345678901 00000012345TESTS SUNDRY PAYME131 TESTS RE TESTSLIN
NS1234567890123456789012345678901 00000012345TESTS SUNDRY PAYME132 TESTINGS MORTGAG
GES1234567890123456789012345678901 00000012345TESTS SUNDRY PAYME937 TESTS SUNDRY PA
有人可以提出任何有关为何发生这种情况的建议吗?任何帮助将不胜感激。
答案 0 :(得分:1)
这里的问题似乎是手动缓冲打印循环中的偏移量不正确。
具体来说,循环从缓冲区打印100个字符,但是在缓冲区前面只删除了99个字符(尽管评论声称相反)。
awk中的substr
函数从其第二个参数的字符位置开始。因此,要从字符串前面删除x
个字符,您需要使用x+1
作为substr
的参数。
示例:
# Print the first ten characters from the string.
$ awk 'BEGIN {f="12345678901234567890"; print substr(f, 1, 10)}'
1234567890
# Attempt to chop off the first ten characters from the string.
$ awk 'BEGIN {f="12345678901234567890"; print substr(f, 10)}'
01234567890
# Correctly chop off the first ten characters from the string.
$ awk 'BEGIN {f="12345678901234567890"; print substr(f, 11)}'
1234567890
因此,原始脚本中的ls_buffer=substr(ls_buffer,100);
行似乎需要ls_buffer=substr(ls_buffer,101);
。
鉴于您声称原始脚本正在运行,但我不得不怀疑awk
机器上的HP-UX
版本是否与substr
的解释略有不同(不是我知道这是怎么可能的。)
除此之外,这似乎是一个非常奇怪的方式来开展这项业务(手动组装一个缓冲区,然后将其斩断)但是没有看到输入和脚本的其余部分我无法评论更多那个方向。