0

我需要将我的 bash 脚本转换为 OpenVMS,有人知道自动转换器还是可以手动帮助我?

#!/bin/bash
#
# Convert input to .CNF
inputfile=$1

rm outfile;
for line in $(cat $inputfile | awk '{ print $1 }' | tr '\*' ' ' | grep 0041); do
if [ `cat $inputfile | grep ${line:0:11} | wc -l` -eq 100 ]; then
echo "?,    ?,    "${line:2:9}\* >> outfile;
elif [ `cat $inputfile | grep ${line:0:12} | wc -l` -eq 10 ]; then
echo "?,    ?,    "${line:2:10}\* >> outfile;
else
echo "?,    ?,    "${line:2} >> outfile;
fi;
#echo ${line:0:11};
done;
cat outfile | sort -u >> newoutfile;

输入文件包含一个数字列表,如果后面有 10 或 100 个数字,我需要将它们分组,否则正常打印它们。例子:

0041XYZ070690*
0041XYZ070691*
0041XYZ070692*
0041XYZ070693*
0041XYZ070694*
0041XYZ070695*
0041XYZ070696*
0041XYZ070697*
0041XYZ070698*
0041XYZ070699*
0041XYZ077778* 
0041XYZ077949* 
0041XYZ077950* 

变成:

?,    ?,    0041XYZ07069*
?,    ?,    0041XYZ077778
?,    ?,    0041XYZ077949
?,    ?,    0041XYZ077950
4

5 回答 5

1

另一种选择是在 Python 中执行此操作

作者没有说明他们正在运行哪个版本的 OpenVMS

如果是旧版本(8.2之前)可以下载LD工具安装。从内存中,它将需要重新启动

从 8.2 开始,LD 工具完全集成到 OpenVMS 中

LD 工具将允许您在 OpenVMS 上创建和挂载容器文件

有 Python LD 容器文件已经预装了 Python,这意味着您不必安装 Python,只需挂载 Python LD 容器文件并运行它(首先您需要通过编译来准备 Python 构建,但这都包含在 LD 文件中,它不会在 OpenVMS 平台上安装任何新内容)

安装 Python 后(在 LD 容器文件中),您可以编写 Python 脚本并根据需要调用它们

脚步:

  1. 如果 OpenVMS < 8.2; 下载并安装 LD 实用程序;重启

( http://www.digiater.nl/lddriver.html )

  1. 下载适用于 OpenVMS 容器和相关工具容器的 Python(2 个 LD 映像)。

( http://www.vmspython.org/doku.php?id=downloadandinstallationpython )

  1. 将 LD 容器文件挂载为 LD 磁盘

  2. 编译 Python(这是一次性的)

  3. 运行 Python 启动(本地到您的进程或系统范围,您的选择)

  4. 调用 Python

于 2016-08-22T15:56:09.763 回答
0

我不知道转换器,但你应该能够在 DCL 中轻松地做到这一点。棘手的部分将用几行逻辑处理替换 AWK 处理 - 除非您的系统有可用的 GAWK。

我不知道 bash,但很清楚您需要使用哪些 DCL 命令。我建议在 DCL HELP(例如 $ help open)或文档集中查看以下内容,

打开

词法(特别是 f$locate 和 f$extract)

如果(那么/否则)

我想这取决于你已经知道多少 DCL。如果您需要学习基础知识,那么 OpenVMS 用户手册是一个很好的起点http://h71000.www7.hp.com/doc/731final/6489/6489pro_contents.html (第 2、12、13 和 14 章)特别是)。

Alos http://dcl.openvms.org/可能是一个方便的资源——你甚至可以在那里找到一个转换器。

于 2012-05-10T00:38:06.350 回答
0

由于 GNV 非常不稳定,我决定使用外部 Linux 主机,它首先通过 ssh 接收输出,然后修改它(使用上面的脚本)并通过 sftp 将其写回。

于 2013-01-11T10:37:03.963 回答
0

您可能对 GNV(OpenVMS 上的 GNU)套件感兴趣。 http://h71000.www7.hp.com/opensource/gnv.html

它是免费的并且有效。它支持 bash,但不确定 awk。这样,您应该能够在 VMS 上使用相同的脚本。

在 DCL 中重写你的脚本也是很有可能的。除了使用 DCL“等效项”直接复制 bash 步骤之外,还有几种方法可以做到这一点。如果您仍然需要帮助,您可以告诉我。

于 2012-05-24T20:40:10.630 回答
0

两年后,我偶然发现了这个话题。为什么不完全在 AWK 或 PERL 中解决这个问题?该死的脚本小马/一招小马!使用的解决方案不会扩展,因为它是 N 方算法(然后还有更多)

对于存在的每条数据行,数据文件都会被完全读取(两次。由 cat 和 grep 读取)这表明一定没有数百万行。

这个假设允许我们简单地将“十”和“百”计数器累加到一个数组中。最坏的情况(一个唯一的数百组中的每个记录)每个数组中的元素将与输入记录一样多。更有可能的是总数不到一半。下面的 awk 脚本应该可以在 OpenVMS 上运行,并且仅使用提供的数据集进行测试。对于“真正的”解决方案,最好知道输入是否已排序,是否有重复,等等。

享受吧,海因。

$!  DCL ... is is not. Just AWK
$ gawk /VAR=(INPUTFILE='p1') /INPUT=SYS$INPUT NL:
BEGIN {
   while ((getline < INPUTFILE) > 0) {
     lines++
     if ($0 !~ /0041/)  continue
     tens[substr($0,1,12)]++
     huns[substr($0,1,11)]++
   }
   print lines i" lines read from " INPUTFILE
   close (INPUTFILE)
   while ((getline < INPUTFILE) > 0) {
     if ($0 !~ /0041/) continue
     sub(/\*/,"",$0)
     k =  substr($0,1,11)
     x =  huns[k]
     if (x == -1) continue
     if (x == 100) {
        print "?, " k "**"
        huns[k] = -1
        continue
        }
     k = substr($0,1,12)
     x = tens[k]
     if (x == -1) continue
     if (x == 10) {
        print "?, " k "*"
        tens[k] = -1
        continue
        }
     print "?, " $0
     }
}
$ EXIT
于 2013-07-17T16:08:27.733 回答