【问题标题】:Kshell read a file and define record length then strip ascii 20 characters from the end of each recordKshell 读取文件并定义记录长度,然后从每条记录的末尾去除 ascii 20 个字符
【发布时间】:2013-08-01 08:00:22
【问题描述】:

我正在将文件传输从 OpenVMS 服务器转移到 Unix 服务器,并且有一个 VMS 程序逐条读取该文件,定义记录长度为 320,然后从每条记录的结尾。如何使用 KSH 脚本执行此操作?

我只想逐条读取文件,从每条记录中的位置 320 剥离所有 ascii 20 个字符回到有实际好字符的位置(记录的真正结尾),然后将其写入新的文件。

提前致谢!

编辑:我在 AIX 6 上

【问题讨论】:

    标签: linux scripting sed awk ksh


    【解决方案1】:

    你可以使用 sed:

    sed -i -r 's/(.{319})\x14(.*)$/\1\2/' file
    

    此命令将读取前 319 个字符,然后是 \x14(ASCII 20),然后是该行的其余部分。然后它将放回匹配组#1 和匹配组#2。这将忽略\x20

    sed 的-i 标志(内联)将保存更改的文件。

    编辑:在 AIX 上试试这个 sed:

    sed 's/\(.\{319\}\)'$'\x14''\(.*\)$/\1\2/' file > _temp && mv _temp file
    

    最终解决方案:经过调查(参见 cmets),发现文件有尾随空格(十六进制 20)而不是 ASCII 20。一旦建立,以下解决方案有效:

    sed 's/ *$//' file > _temp && mv _temp file
    

    【讨论】:

    • 非常感谢,但 -i 和 -r 都不是公认的标志。看起来这是一个 AIX 服务器,抱歉没有澄清。有不同的语法吗?
    • AIX 是否支持 sed 中的 -E 标志?
    • 是的,如果有帮助,我可以使用脚本执行 -e!
    • 嗨,anubhava,现在我正在深入挖掘,我想我得到了不好的要求。我找到了他们用来在旧系统上进行转换的 C 代码,它是十六进制字符 20,而不是 ascii 20,所以它是一个空格。这是否使修剪每条记录末尾的空格变得更容易?很抱歉造成混淆,我现在才注意到这一点,因为我将其转储并看到 040(空格、十六进制 20 等)字符。
    • 这正是我所需要的,感谢所有帮助 anubhava !!!我没有足够的声誉来投票给你的答案,但我会尽快。谢谢!!!
    【解决方案2】:

    ksh:

    while IFS= read -r line; do
        record=${line:0:320}           # the first 320 chars of the line
        echo "${record%%+(\x14)}"      # removes ascii 20 chars from end of record
    done < input.file > output.file
    

    如果我误读了您的要求,请告诉我。

    【讨论】:

    • 格伦,这听起来像是我想要做的,但我得到了一个错误。我忘了提到我在这里使用 AIX,也许语法不同?当我将其放入具有静态输入文件名和输出文件名的 .ksh 文件中并尝试运行它时,它会显示“./readwhile.ksh[2]: record=${line:0:320}: 0403-011 The指定的替换对此命令无效。"
    • 你有什么版本的ksh?
    • 对不起,格伦,我似乎无法找到 - $ ksh --version --version: 0403-010 指定的标志对于此命令无效。 $ echo $KSH_VERSION $ echo ${.sh.version} /bin/ksh: ${.sh.version}: 0403-011 指定的替换对该命令无效。 $ 对找到版本的替代方法有什么想法吗?
    • 您可以尝试what $(type -p ksh),但请查看您的 ksh 手册页以查看我建议的语法在您的版本中是否有效。它适用于我在旧 Solaris 机器上的 ksh“版本 M-11/16/88i”。
    • 谢谢,格伦。这似乎对我也不起作用。根据 ksh 版本执行“record=${line:0:320}”之类的语法是否不同?有替代语法吗?你概述的正是我需要做的,我只是在努力让它真正发挥作用!我非常感谢您的帮助,并且很乐意完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多