在查找和使用管道中调用外部命令
Calling external command in find and using pipe
我想知道是否有一种方法可以在 AIX 6.x 上使用 find 命令从某个目录(包括子目录)搜索所有文件,然后再调用外部命令(例如 hlcat)[=25] =] 将它们转换为可读格式,然后可以通过 grep 命令进行管道传输以查找模式,而不是在 shell?
中使用循环
e.g. find . -type f -name “*.hl7” -exec hlcat {} | grep -l “pattern” \;
上面的命令不起作用,我必须使用 while 循环来显示内容并搜索模式,如下所示:
find . -type f -name “*.hl7” -print | while read file; do
hlcat $file | grep -l “pattern”;
done
同时,这些 HL7 文件已用圆括号重命名,这样可以防止在文件名周围没有双引号的情况下打开它们。
e.g. hlcat (patient) filename.hl7 will fail to open.
hlcat “(patient) filename.hl7” will work.
简而言之,我正在查找命令中寻找一种干净简洁的单行方法,并查看和搜索这些带有圆括号名称的 HL7 文件的内容。
非常感谢,
乔治
P.S。 HL7原始数据由一条连续的线组成,不可读,除非使用hlcat等工具将其转换成可读的格式。
在
更新:简单的方法
find . -type f -name '*.hl7' -exec grep -iEl 'Barry|Jolene' {} +
注意: 不过您可能会得到一些误报。请参阅下文进行有针对性的搜索。
正在一堆 HL7v2 文件中搜索 名字:
1。查看 HL7v2 文件格式
HL7 示例v2 PID
段:
PID|||56782445^^^UAReg^PI||KLEINSAMPLE^BARRY^Q^JR||19620910|M|||
PID
段分解:
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。编写有针对性的搜索
使用 grep
(AIX):
find . -type f -name '*.hl7' -exec grep -iEl '^PID\|([^|]*\|){4}[^^|]*\^(Barry|Jolene)\^' {} +
与awk
:
find . -type f -name '*.hl7' -exec awk -v firstname='^(Barry|Jolene)$' '
BEGIN { FS="|" }
FNR == 1 { if( found ) print filename; found = 0; filename = FILENAME }
== "PID" { split(, name, "^"); if (toupper(name[2]) ~ toupper(firstname)) { found = 1 } }
END { if ( found ) print filename }
' {} +
备注: 这个 awk
解决方案的优点是您将 名字正则表达式 作为 参数。这个解决方案很容易扩展,例如搜索 last name.
我想知道是否有一种方法可以在 AIX 6.x 上使用 find 命令从某个目录(包括子目录)搜索所有文件,然后再调用外部命令(例如 hlcat)[=25] =] 将它们转换为可读格式,然后可以通过 grep 命令进行管道传输以查找模式,而不是在 shell?
中使用循环e.g. find . -type f -name “*.hl7” -exec hlcat {} | grep -l “pattern” \;
上面的命令不起作用,我必须使用 while 循环来显示内容并搜索模式,如下所示:
find . -type f -name “*.hl7” -print | while read file; do
hlcat $file | grep -l “pattern”;
done
同时,这些 HL7 文件已用圆括号重命名,这样可以防止在文件名周围没有双引号的情况下打开它们。
e.g. hlcat (patient) filename.hl7 will fail to open.
hlcat “(patient) filename.hl7” will work.
简而言之,我正在查找命令中寻找一种干净简洁的单行方法,并查看和搜索这些带有圆括号名称的 HL7 文件的内容。
非常感谢, 乔治
P.S。 HL7原始数据由一条连续的线组成,不可读,除非使用hlcat等工具将其转换成可读的格式。 在
更新:简单的方法
find . -type f -name '*.hl7' -exec grep -iEl 'Barry|Jolene' {} +
注意: 不过您可能会得到一些误报。请参阅下文进行有针对性的搜索。
正在一堆 HL7v2 文件中搜索 名字:
1。查看 HL7v2 文件格式
HL7 示例v2 PID
段:
PID|||56782445^^^UAReg^PI||KLEINSAMPLE^BARRY^Q^JR||19620910|M|||
PID
段分解:
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。编写有针对性的搜索
使用 grep
(AIX):
find . -type f -name '*.hl7' -exec grep -iEl '^PID\|([^|]*\|){4}[^^|]*\^(Barry|Jolene)\^' {} +
与awk
:
find . -type f -name '*.hl7' -exec awk -v firstname='^(Barry|Jolene)$' '
BEGIN { FS="|" }
FNR == 1 { if( found ) print filename; found = 0; filename = FILENAME }
== "PID" { split(, name, "^"); if (toupper(name[2]) ~ toupper(firstname)) { found = 1 } }
END { if ( found ) print filename }
' {} +
备注: 这个 awk
解决方案的优点是您将 名字正则表达式 作为 参数。这个解决方案很容易扩展,例如搜索 last name.