Преобразование сценария 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

person Nexus2k    schedule 08.05.2012    source источник
comment
ВМС? Как на языке сценариев DCL? Надеюсь, вы не серьезно, я не использовал это десятилетиями :-)   -  person paxdiablo    schedule 08.05.2012
comment
@paxdiablo Точно, к сожалению, один из наших сервисов все еще работает на серверах OpenVMS, которые мне сейчас приходится администрировать.   -  person Nexus2k    schedule 08.05.2012
comment
Это то, что вам просто нужно запустить один раз, или что-то, что будет запускаться регулярно? Насколько велик файл? Есть ли доступный компилятор, например. Паскаль?   -  person HABO    schedule 09.05.2012
comment
или компилятор Си? Проще просто установить платформу инструментов GNU. ИЛИ вы видели hoffmanlabs.org/vmsfaq/vmsfaq_020.html#soft2 . Обе указанные ссылки по-прежнему активны. Удачи.   -  person shellter    schedule 09.05.2012
comment
Нет, я действительно хочу сделать это только с помощью DCL, так как я не буду ничего устанавливать на такую ​​старую и критическую систему.   -  person Nexus2k    schedule 09.05.2012
comment
Сначала рассмотрите возможность упрощения вашего bash-скрипта; это облегчит перевод. Например, cat file | grep pattern | wc -l можно сократить до grep -c pattern file. (Я знаю, что Perl работает на VMS, но не думаю, что он у вас установлен.)   -  person Keith Thompson    schedule 10.05.2012
comment
Мне помогло более раннее издание этой книги. давний пользователь Unix, изучаю VMS (пришлось читать сбоку). Это может также быть полезным.   -  person Keith Thompson    schedule 10.05.2012
comment
Какие компиляторы языка HLL уже установлены?   -  person Keith Thompson    schedule 10.05.2012


Ответы (5)


Другой вариант - сделать это в 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. Загрузите Python для контейнера OpenVMS И связанного с ним контейнера инструментов (2 образа LD).

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

  1. Смонтируйте файлы контейнера LD как LD-диски

  2. Скомпилируйте Python (это один раз)

  3. Запустите запуск Python (локально для вашего процесса ИЛИ для всей системы, на ваш выбор)

  4. Вызвать Python

person IanD    schedule 22.08.2016

Я не знаю конвертера, но вы сможете легко сделать это в 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, в частности).

Кроме того, http://dcl.openvms.org/ может быть полезным ресурсом — вы даже можете найти там конвертер .

person ChrisB    schedule 10.05.2012
comment
Также p1 за 1 доллар, удалить за rm. Команда sort остается как sort для вызова утилиты sort/merge. Но я думаю, что материал awk/tr/grep будет раздражать при воспроизведении в DCL. - person Mark Reed; 10.05.2012

Возможно, вас заинтересует комплект GNV (GNU на OpenVMS). http://h71000.www7.hp.com/opensource/gnv.html

Это бесплатно и работает. Он поддерживает bash, хотя не уверен насчет awk. Таким образом, вы сможете использовать тот же скрипт на VMS.

Также вполне возможно переписать ваш скрипт на DCL. Есть несколько способов сделать это, кроме прямой репликации шагов bash с «эквивалентами» DCL. Вы можете сообщить мне, если вам все еще нужна помощь.

person vmsnomad    schedule 24.05.2012
comment
К сожалению, ГНВ оказался бесполезен. Поскольку я использовал функции работы с подстроками, которых нет в bash 1.4.17. Я пытался преобразовать части подстроки в awk, что было невероятно медленно. Поэтому я снова удалил его. - person Nexus2k; 28.05.2012
comment
Если вы удалили GNV, по крайней мере, это дает вам больше свободы для повторного сценария в bash. Если вам все еще нужно решение DCL, я попытался написать его на кластере Deathrow VMS для удовольствия. Решение не такое компактное, как bash, но вроде работает. - person vmsnomad; 06.06.2012
comment
Не знаю, как сюда прикрепить файл, поэтому оставил файл: nexus2k.com на gein deathrow в DEMO-аккаунте (вы также можете запустить его в [.nexus2k]). Надеюсь, поможет. - person vmsnomad; 06.06.2012

Поскольку GNV был очень нестабильным, я решил использовать внешний хост Linux, который сначала получает вывод по ssh, затем изменяет его (с помощью приведенного выше сценария) и записывает обратно по sftp.

person Nexus2k    schedule 11.01.2013

С опозданием на два года я наткнулся на эту тему. Почему бы вам не решить эту проблему полностью на AWK или PERL? Проклятые скриптовые сосиски / пони с одним трюком! Используемое решение не будет масштабироваться, так как это алгоритм 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
person Hein    schedule 17.07.2013