AS400系统中Shell脚本合并多文本文件格式错乱求助
解决AS/400上Shell脚本合并文件格式错乱的问题
这个问题我之前在AS/400环境里踩过坑,核心原因是AS/400的文件系统是记录导向的,而cat这类Unix命令是为流式文件设计的,直接用cat处理AS/400的物理文件(PF)会把记录的长度标识、分隔符当成普通文本内容,导致行被截断或错乱拼接。
最可靠的解决方案:使用AS/400原生命令CPYF
AS/400提供了专门处理文件复制/合并的原生命令CPYF(Copy File),它能正确识别和保留原文件的记录格式,不会出现对齐错乱的问题。你可以把原来的cat命令替换成循环调用CPYF的脚本:
# 遍历所有目标后缀的文件 for src_file in *.${3} do # 追加文件内容到目标文件,MBROPT(*ADD)表示追加模式 CPYF FROMFILE(${src_file}) TOFILE(${2}) MBROPT(*ADD) done
关键参数说明:
FROMFILE(${src_file}):指定要合并的源文件TOFILE(${2}):指定合并后的目标文件MBROPT(*ADD):设置为追加模式,避免覆盖目标文件原有内容
如果一定要用Unix风格命令的替代方案
如果因为某些原因必须用QSH里的Unix命令,你需要先把AS/400的记录式文件转换成流式文件,再进行合并。可以用dd命令指定记录长度,不过这种方法需要你提前知道文件的记录长度(用DSPFD FILE(文件名)命令可查看):
# 假设记录长度为80,根据你的实际文件调整数值 for src_file in *.${3} do dd if=${src_file} ibs=80 cbs=80 conv=unblock >> ${2} done
为什么cat会出问题?
AS/400的物理文件(PF)不是普通的流式文本文件,它的每个记录都带有长度标识(固定长度或可变长度)。当cat读取这类文件时,会把记录的长度字节当成文本内容输出,同时不会自动把记录分隔转换成换行符,最终导致行内容被截断、拼接,出现你看到的错乱现象。
内容的提问来源于stack exchange,提问作者EstRaj
相关产品推荐
相关产品推荐

