George Jackson
George Jackson

Reputation: 141

Calling external command in find and using pipe

I am wondering if there is a way to search for all the files from a certain directory including subdirectories using a find command on AIX 6.x, before calling an external command (e.g. hlcat) to display/convert them into a readable format, which can then be piped through a grep command to find a pattern instead of using loops in the shell?

e.g. find . -type f -name “*.hl7” -exec hlcat {} | grep -l “pattern” \;

The above command would not work and I have to use a while loop to display the content and search for the pattern as follows:

find . -type f -name “*.hl7” -print | while read file; do
hlcat $file | grep -l “pattern”;
done

At the same time, these HL7 files have been renamed with round brackets which prevent them from being open without having to include double quotes around the file name.

e.g. hlcat (patient) filename.hl7 will fail to open.
        hlcat “(patient) filename.hl7” will work.

In short, I am looking for a clean concise one-liner approach within the find command and view and search their content these HL7 files with round bracket names.

Many thanks, George

P.S. HL7 raw data is made up of one continuous line and is not readable unless it is converted into a workable reading format using tools such as hlcat. in

Upvotes: 0

Views: 173

Answers (1)

Fravadona
Fravadona

Reputation: 17208

Update: The easy way

find . -type f -name '*.hl7' -exec grep -iEl 'Barry|Jolene' {} +

note: You may get some false positives though. See below for a targeted search.


Searching for a first name in a bunch of HL7v2 files:

1. Looking into the HL7v2 file format

Example of HL7v2 PID segment:

PID|||56782445^^^UAReg^PI||KLEINSAMPLE^BARRY^Q^JR||19620910|M|||

PID Segment decomposition:

Seq NAME HHIC USE LEN
0 PID keyword Segment Type 3
3 Patient ID Medical Record Num 250
5 Patient Name Last^First^Middle 250
7 Date/Time Of Birth YYYYMMDD 26
8 Sex F, M, or U 1
2. Writing targeted searches

With grep (AIX):

find . -type f -name '*.hl7' -exec grep -iEl '^PID\|([^|]*\|){4}[^^|]*\^(Barry|Jolene)\^' {} +

With awk:

find . -type f -name '*.hl7' -exec awk -v firstname='^(Barry|Jolene)$' '
    BEGIN { FS="|" }
    FNR == 1 { if( found ) print filename; found = 0; filename = FILENAME }
    $1 == "PID" { split($6, name, "^"); if (toupper(name[2]) ~ toupper(firstname)) { found = 1 } }
    END { if ( found ) print filename }
' {} +

remark: The good part about this awk solution is that you pass the first name regexp as an argument. This solution is easily extendable, for example for searching the last name.

Upvotes: 1

Related Questions