如何从 unix sed 命令读取大型机文件?

Posted

技术标签:

【中文标题】如何从 unix sed 命令读取大型机文件?【英文标题】:How to read mainframe file from unix sed command? 【发布时间】:2018-11-08 15:43:11 【问题描述】:

我正在尝试通过“sed”读取大型机文件,但它无法读取。 该脚本是从大型机 JCL 调用的,因此它内置了 tcsh。

sed -n '1,10p' mainframeFile 

不会产生任何东西,因为它无法读取。

【问题讨论】:

你能解释一下“大型机文件”是什么意思吗? 是的,它是一个 MVS 文件。 只要确保它是一个文本文件而不是二进制文件(低值)。需要用空格替换点。 好吧,我们尝试了'cat MFFile | sed' 命令,但它没有产生任何输出,只是发现正在读取的文件有一些格式问题,我相信点而不是空格。修复文件本身后,该命令起作用了。 'sed' 命令也适用于文本文件,但不适用于二进制文件。低值必须用空格代替。谢谢大家的建议。 【参考方案1】:

当您提到大型机文件时,我假设您指的是 MVS 文件而不是 USS 文件,因为 USS 文件是为 sed 指定的,就像任何其他文件一样。

sed 不能直接使用,您可以使用此 hack 通过使用 cat 并将其泵送到标准输出和管道来使其工作。阅读下文,了解有关 MVS 数据集和命令行实用程序的更多信息。它还提供了有关如何在 USS 命令中指定 MVS 数据集的参考,例如 cat

我在本地系统上试过这个,它与这个 sed 命令一起工作。

cat "//'USER1.TEST.CNTL(JOBCARD)'"

// JOB (CCCCCCCC),'HOGSTROM', // MSGLEVEL=(1,1), // MSGCLASS=O, // 类=A, // 通知=&SYSUID

cat "//'USER1.TEST.CNTL(JOBCARD)'" | sed 's/JOB/BOB/'

// BOB (CCCCCCCC),'HOGSTROM', // MSGLEVEL=(1,1), // MSGCLASS=O, // 类=A, // 通知=&SYSUID

为什么不在sed

在命令行上支持 MVS 文件名的实用程序有限。这个article from IBM 概述了支持的实用程序。

很遗憾,sed 不在列表中

以下实用程序支持使用 MVS™ 文件名。

请参阅每个实用程序的说明以了解限制和例外情况: - 自动挂载 - c89 - cp - MV - 人 - tar不支持使用 DSNTYPE=LARGE 定义的 MVS 数据集。

本节讨论访问MVS files in USS

【讨论】:

话虽如此,您始终可以将该文件复制到一个临时文件并对其执行任何操作,然后将新文件复制回来 当你评论时我正在试验...我最初尝试将cp 发送到标准输出,然后尝试cat 有效...我们需要 Linux 系统服务 老实说,我发现在使用 JZ/OS 库的 JAVA 批处理中这很容易。这可能不是最好的方法,但我发现它肯定是最简单的 Dovetailed Technologies Co:Z Dataset Pipes 是将“经典”MVS 数据集路由到 z/Unix 实用程序的另一种有用机制。 好吧,我们尝试了'cat MFFile | sed' 命令,但它没有产生任何输出,只是发现正在读取的文件有一些格式问题,我相信点而不是空格。修复文件本身后,该命令起作用了。 'sed' 命令也适用于文本文件,但不适用于二进制文件。低值必须用空格代替。谢谢大家的建议。

以上是关于如何从 unix sed 命令读取大型机文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从R中的大型固定宽度文件中读取特定列

大型机迁移到 USS/Github

如何从 Perl 快速访问许多大型 CSV 文件中的数据?

macmatlab导入大型csv

如何在SSIS中将大型Excel文件拆分为多个小文件?

正则表达式 - grep、sed、awk - 处理大型文本文件