我需要将我的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
答案 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脚本并根据需要调用它们
步骤:
(http://www.digiater.nl/lddriver.html)
(http://www.vmspython.org/doku.php?id=downloadandinstallationpython)
将LD容器文件挂载为LD磁盘
编译Python(这是一次性的)
运行Python启动(您的流程本地或系统范围,您的选择)
调用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