Как мне искать текст в файле с DCL

Как мне искать текст в файле с помощью DCL? Да, я должен использовать DCL.

Формат файла прост:

<NUMBER OF ENTRIES>
<ID>  <DIRECTORY>
<ID>  <DIRECTORY>
.
.
.
<ID>  <DIRECTORY>

Они разделены несколькими пробелами. Мне просто нужно найти файл с заданным идентификатором и извлечь каталог.

Это действительно простая задача, но я не могу найти где-нибудь достойную документацию по DCL.

2 ответа

Решение
Edited.... the forum 'eats' strings like <xx> unless marked as code.    

Есть ли заостренные скобки на даталинах или нет? Пожалуйста, предоставьте НАСТОЯЩИЙ пример, это или: XX XXX-DIRECTORY

Я предполагаю первое.

VMS в том виде, в котором она поставляется, НЕ имеет стандартного инструмента для выбора поля из записи. Но есть множество стандартных инструментов, доступных для OpenVMS, которые могут сделать это. В основном (g)AWK и PERL. Вот что я бы использовал:

$ gawk /comm="$1 == ""<xx>"" { print $2 }" tmp.tmp
<xxx-DIRECTORY>

или же

$ perl -ne "print $1 if /^\s*<xx>.*?<([^>]*)/" tmp.tmp
xxx-DIRECTORY

Они могут быть увеличены с учетом чувствительности к регистру и пространству при необходимости и обрезать <> по мере необходимости. И, возможно, вам нужен идентификатор поиска, чтобы быть параметром или нет.

Во всяком случае, в чистом сценарии DCL это может выглядеть как....

$ IF p2.eqs."" then exit 16
$ CLOSE/NOLOG file
$ OPEN/READ file 'p1
$loop:
$ READ/END=done file rec
$ id = F$EDIT( F$ELEM(0,">",F$ELEM(1,"<",rec)), "UPCASE")
$ IF id.NES.p2 THEN  GOTO loop
$ dir = F$ELEM(0,">",F$ELEM(2,"<",rec))
$ WRITE SYS$OUTPUT dir
$ GOTO loop
$done:
$CLOSE/NOLOG file

если <> не существует, используйте это для ядра...

$ rec = F$EDIT(rec,"TRIM,COMPRESS")
$ id = F$EDI(F$ELEM(0," ",rec),"UPCASE")
$ IF id.NES.p2 THEN  GOTO loop
$ dir = F$ELEM(1," ",rec)

И Perl будет:

$ perl -ne "print $1 if /^\s*<xx>\s+(\S+)/" tmp.tmp

Удачи хейн

В качестве альтернативы, если поле идентификатора выглядит как фиксированная ширина, вы можете преобразовать файл в RMS INDEXED с ключом в поле идентификатора. Тогда вы можете просто сделать поиск по телефону READ/KEY='ID',

Позвоните в ПОМОЩЬ на CONVERT, READ /KEY и, возможно, SEARCH /KEY

Другие вопросы по тегам