End of Line Overflow 在下一行的开头

End of Line Overflow in start of next line

所以我遇到了一个 AWK 脚本,它曾经在 HP-UX 上工作,但已移植到 RHEL6.4/6.5。它会在文件中创建 headers 和预告片,而主脚本 body 会处理记录格式。

我现在运行时遇到的问题是第一行的最后一个字母流到下一行的开头。然后第二行的最后两个字母流入第三行的开头,依此类推。

这是处理记录格式的脚本部分:

ls_buffer=ls_buffer [=10=];
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 十六进制替换删除了它们,进一步在代码中,但它在 100 处结束,然后 re-printing第二行开头的最后一个字符。

这是一些示例测试输出,以防万一:

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

任何人都可以就发生这种情况的原因提供任何建议吗?任何帮助将不胜感激。

这里的问题似乎是手动缓冲区打印循环中的偏移量不正确。

具体来说,循环从缓冲区打印 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);

鉴于您声称原始脚本正在运行,但我想知道 HP-UX 机器上 awk 的任何版本是否对 substr 的解释略有不同(并不是说我知道这怎么可能)。

除此之外,这似乎是处理此业务的一种非常奇怪的方式(手动组装缓冲区然后将其切碎)但是没有看到输入和脚本的其余部分我无法评论更多那个方向。