将Bash脚本转换为OpenVMS语法

时间:2012-05-08 08:45:26

标签: bash shell scripting 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

5 个答案:

答案 0 :(得分: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实用程序;重新启动
  2. http://www.digiater.nl/lddriver.html

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

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

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

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

      4. 调用Python

答案 1 :(得分:0)

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

我不知道bash,但很清楚你需要使用哪些DCL命令。我建议在DCL HELP(例如$ help open)或文档集

中查看以下内容

开放

lexicals(特别是f $ locate和f $ extract)

if(then / else)

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

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

答案 2 :(得分:0)

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

它是免费的并且有效。它支持bash,虽然不确定awk。 这样您就可以在VMS上使用相同的脚本。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

两年后我偶然发现了这个话题。 你为什么不在AWK或PERL中完全解决这个问题? Darn script weenies / one-trick ponies! 使用的解决方案不会缩放,因为它是N-Square算法(然后是更多)

对于每个存在的数据行,完全读取数据文件(两次。通过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