[Info-vax] Text processing on VMS
Arne Vajhøj
arne at vajhoej.dk
Sun Oct 13 15:26:03 EDT 2024
On 10/13/2024 2:57 PM, Dave Froble wrote:
> On 10/13/2024 2:39 PM, Arne Vajhøj wrote:
>> On 10/13/2024 11:04 AM, David Meyer wrote:
>>> I've got a text file with data that I want to select lines matching
>>> certain character strings, then extract string values from the selected
>>> lines by character position. On Unix, I would use awk or Perl. Does VMS
>>> have a similar tool, should I use my favorite programming language and
>>> call the STR$ RTL, can I write a TPU script to do this, or should I
>>> transfer the file to a Unix box and user awk or Perl? ;)
>>
>> Both Perl and gawk are available for VMS.
>>
>> VSI distribute Perl - Alpha and Itanium here
>> https://vmssoftware.com/products/perl/ - x86-64 I believe comes with VMS
>>
>> Gawk you can get from the net -
>> https://vms.process.com/scripts/fileserv/fileserv.com?GAWK
>>
>> You can also use some other script language: Python, Groovy etc..
>>
>> (I like Groovy)
>>
>> A traditional VMS language (Cobol,Fortran,Basic,Pascal) and builtin
>> string functionality or STR$ calls will likely be much more code.
>
> Using SEARCH and then a simple Basic program is not that much work.
>
> For example:
>
> SEARCH File1.txt "some text" /output=File2.txt
>
> 1 On Error Goto 90
>
> 10 Open "file2" For Input as File 1%
> Open "File2" For Output as File 2%
>
> 20 Linput #1%, Z$
> Print #2%, Mid(Z$,?,?)
> Goto 20
>
> 90 GoTo 99 If ERR=11
> On Error GoTo 0
>
> 99 End
>
> Simple
> No having to know whatever is your favorite utility
> I seriously doubt there would be much fewer characters
>
> No, I didn't try it ...
I have confidence in your VMS Basic skills.
:-)
A compound solution of SEARCH and a program is an option.
But in a relevant script language then it should be a one statement
problem (although in most cases splitting that one statement over
multiple lines is a good thing for readability).
import java.nio.file.*
Files.lines(Paths.get("login.com"))
.filter(line -> line.contains("java"))
.map(line -> line[2..12])
.forEach(System.out::println)
output pos 2..12 (pos is 0 based!) from all lines of login.com
that contains "java".
Arne
More information about the Info-vax
mailing list