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;

inputfileには、番号のリストが含まれています。次の番号が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がプリインストールされているPythonLDコンテナファイルがあります。つまり、Python自体をインストールする必要はなく、Python LDコンテナファイルをマウントして実行するだけです(最初に、コンパイルしてPythonビルドを準備する必要があります)。 、ただし、これはすべてLDファイルに含まれているため、OpenVMSプラットフォームに新しいものはインストールされません)

Pythonを(LDコンテナファイル内に)インストールしたら、Pythonスクリプトを記述して、必要に応じて呼び出すことができます。

手順:

  1. ActiveX<8.2の場合; LDユーティリティをダウンロードしてインストールします。リブート

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

  1. Python forOpenVMSコンテナと関連ツールコンテナ(2つのLDイメージ)をダウンロードします。

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

  1. LDコンテナファイルをLDディスクとしてマウントする

  2. Pythonをコンパイルします(これは1回限りです)

  3. Pythonスタートアップを実行します(プロセスのローカルまたはシステム全体、選択)

  4. Pythonを呼び出す

于 2016-08-22T15:56:09.763 に答える
0

コンバーターについては知りませんが、DCLでこれを非常に簡単に実行できるはずです。トリッキーなビットは、システムでGAWKが使用可能でない限り、AWK処理を数行のロジック処理に置き換えることです。

bashはわかりませんが、どのDCLコマンドを使用する必要があるかは明らかです。DCLヘルプ(例:$ help open)またはドキュメントセットのいずれかで以下を確認することをお勧めします。

開いた

読む

字句(特にf$locateとf$extract)

if(then / else)

書きます

それはあなたがすでに知っているDCLの量に依存すると思います。基本を学ぶ必要がある場合は、OpenVMSユーザーズマニュアルから始めるのがよいでしょう。http://h71000.www7.hp.com/doc/731final/6489/6489pro_contents.html (第2章、第12章、第13章、および第14章partiuclar)。

Alos http://dcl.openvms.org/は、便利なリソースになる可能性があります。そこにコンバーターが見つかることもあります。

于 2012-05-10T00:38:06.350 に答える
0

GNV(OpenVMS上のGNU)キットに興味があるかもしれません。 http://h71000.www7.hp.com/opensource/gnv.html

それは無料で、動作します。awkについてはわかりませんが、bashをサポートしています。このようにして、VMSで同じスクリプトを使用できるようになります。

DCLでスクリプトを書き直すことも可能です。DCLの「同等物」を使用してbashステップを直接複製する以外に、これを行う方法はいくつかあります。それでもサポートが必要な場合は、お知らせください。

于 2012-05-24T20:40:10.630 に答える
0

GNVは非常に不安定だったので、最初にsshで出力を受け取り、次にそれを変更して(上記のスクリプトで)、sftpで書き戻す外部Linuxホストを使用することにしました。

于 2013-01-11T10:37:03.963 に答える
0

2年遅れて、私はこのトピックに出くわしました。この問題をAWKまたはPERLで完全に解決しないのはなぜですか?くそスクリプトウィニー/ワントリックポニー!使用されているソリューションは、N-Squareアルゴリズム(およびそれ以上)であるため、スケーリングされません。

存在するすべてのデータ行について、データファイルは完全に読み取られます(2回。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 に答える