SortParagraph

Pipelines v1.9

 

.* Example by TenFiftyTwo(c).

Home

 
.* &arg1. The number of the paragraph to sort.
.* &arg2. The sort type (a)scending or (d)escending.
 
.* The pipeline reads its input and selects the specified paragraph and sorts
.* it, writing the result back to its caller.
 
.* Note. that if any input record contains the hexadecimal characters x'fc'
.* through x'ff'; you will need to substitute the character for another character
.* not present in the record.
 
pipe (endchar ?)
     in                               .* Input.
     | literal xfdfe                  .* Ensure paragraph is marked.
     | strip                          .* Trim off whitespace.
     | a: locate                      .* Route out blank records.
 
     .* Concatenate groups of records that make up a paragraph.
 
     | specs xfc 1 1-* n              .* Insert start of line flag.
     | split after str xfc            .* Split into individual records.
     | b: faninany                    .* Feed blank records back into pipeline.
     | join until str xfc             .* Join records in current paragraph.
     | c: nlocate xfd                 .* Go and mark start of paragraph.
     | d: faninany                    .* Feed paragraph marker back into pipeline.
     | split before str xfd           .* Separate records back into paragraph format.
 
     .* Select the paragraph that we want to sort.
 
     | e: fromlab pat /Para#&arg1*/   .* Select records between the start of the..
     | f: tolabel pat xfd2a           .* ..paragraph and the start of the next.
     | sort anycase &arg2             .* Sort the paragraph.
     | nlocate /Para#/                .* Discard the paragraph marker.
     | specs recno 1 1-* nw           .* Insert leading record number.
     | g: fanin 1 0 2                 .* Merge all the streams.
     | nlocate /Para#/                .* Discard all paragraph markers.
     | nlocate xfdfe                  .* Discard start of file marker.
     | change xfd //                  .* Discard blank record marker.
     | out                            .* Output.
     ?
     a:
     | specs xfd 1                    .* Indicate blank records with a marker.
     | b:
     ?
     c:
     | specs 1-* 1 write              .* Mark the start of a paragraph.
             /Para#/ n
             recno strip n
     | d:
     ?
     e:
     | elastic                        .* Handle records that come before start..
     | g:                             .* ..of a paragraph.
     ?
     f:
     | elastic                        .* Handle records that come after the end of..
     | g:                             .* ..a paragraph.