2012-05-08 73 views
0

我需要将我的bash脚本转换为OpenVMS,是否有人知道自动转换器或可以帮助我手动?转换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 
+1

VMS?就像在DCL脚本语言中一样?我希望你不是那么认真,我已经用了几十年了:-) – paxdiablo

+0

@paxdiablo完全不幸的是,我们的一项服务仍然运行在OpenVMS服务器上,我现在必须管理它 – Nexus2k

+0

这是你需要运行的东西一次,还是会定期运行的东西?文件有多大?是否有编译器可用,例如帕斯卡尔? – HABO

回答

0

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

0

我不知道一个转换器,但你应该能够在DCL做到这一点很容易地。 棘手的位将用几行逻辑处理来代替AWK处理 - 除非系统具有GAWK可用。

我不知道bash,但很清楚你需要使用哪些DCL命令。我建议看在任何DCL帮助下(如$帮助打开)或文档集,

开放

阅读

的词汇(特别是F $定位和f $提取物)

如果(再/人)

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

阿洛斯http://dcl.openvms.org/可能是一个非常方便的资源 - 你甚至可以找到一个转换器出现。

+0

也为1美元的p1,删除rm。排序命令保持为“排序”,以调用排序/合并实用程序。但我认为awk/tr/grep的东西在DCL中复制会很麻烦。 –

0

您可能对GNV(GNU on OpenVMS)工具包感兴趣。 http://h71000.www7.hp.com/opensource/gnv.html

它是免费的,它的工作原理。它支持bash,但不确定awk。 这种方式你应该能够在VMS上使用相同的脚本。

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

+0

不幸的是,GNV没用。因为我使用了bash 1.4.17中没有的substring函数。我试图将子串部分转换为令人难以置信的慢速awk。所以我再次删除它。 – Nexus2k

+0

如果你至少将GNV解压缩,它会给你更多的自由来重新编写脚本。如果你仍然需要DCL解决方案,我试图在deathrow VMS集群上编写脚本,以获得它的乐趣。该解决方案不像bash那样紧凑,但似乎可行。 – vmsnomad

+0

不知道如何在这里附加一个文件,所以我把文件:nexus2k.com放在DEMO账号的deathrow's gein上(你也可以在[.nexus2k]中运行它)。希望能帮助到你。 – vmsnomad

0

两年后,我偶然发现了这个话题。 你为什么不用AWK或PERL完全解决这个问题?补充脚本weenies/one-trick小马! 所用不会规模,因为它的解决方案是一个N方算法(然后一些更多)

对于每个本发明的数据线,所述数据文件被完全读取(两次。通过两个猫和grep) 这表明一定不会有数百万行。

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

Enjoy, Hein。

$! 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 
1

另一种选择是要做到这一点在Python

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

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

8.2起,LD工具已完全集成到OpenVMS的

的LD工具将允许您创建和安装OpenVMS上的容器文件

有Python的LD容器文件它们预先安装了Python,这意味着您不必像这样安装Python,只需安装Python LD容器文件并运行它即可(首先,您需要通过编译来准备Python版本,但这些都包含在内在LD文件中,它不会在OpenVMS平台上安装任何新东西)

一旦你已经安装了Python(劳工处容器文件内),你可以写你的Python脚本并在必要时给他们打电话

步骤:

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

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

  • 下载的Python OpenVMS的容器和相关联的工具的容器(2个LD图像)。
  • http://www.vmspython.org/doku.php?id=downloadandinstallationpython

  • 装入LD容器文件作为LD盘

  • 编译的Python(这是一个一次关闭)

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

  • 调用Python