Unix 如何搜索两种模式并根据结果写出不同的行

Unix 如何搜索两种模式并根据结果写出不同的行,unix,awk,sed,scripting,grep,Unix,Awk,Sed,Scripting,Grep,我有两万多个存档文件要搜索特定模式,并希望从结果中输出每个文件的第4行。是的,这些文件可以使用grep吗 数据如下所示: UNA:+.? ' UNB+UNOC:1+XXX:ZZ+ZZZ:14+140726:0215+AA000083308210++INVOIC' UNH+1+INVOIC:D:98A:UN' BGM+380+4161846758' DTM+3:20140725:102' DTM+140:20140908:102' RFF+ON:4501161623' NAD+SU+2024241

我有两万多个存档文件要搜索特定模式,并希望从结果中输出每个文件的第4行。是的,这些文件可以使用grep吗

数据如下所示:

UNA:+.? '
UNB+UNOC:1+XXX:ZZ+ZZZ:14+140726:0215+AA000083308210++INVOIC'
UNH+1+INVOIC:D:98A:UN'
BGM+380+4161846758'
DTM+3:20140725:102'
DTM+140:20140908:102'
RFF+ON:4501161623'
NAD+SU+2024241::90++WSWSInternational bvba/sprl        +DeereResearchpark Zone 3:Geldenaaksebaan 464:B-XCXCLeuven, BELGIUM:.++++BE'
RFF+VA:BE0403593343'
RFF+VR:2024241'
NAD+PS+5050083901044::9++Wimble Manufacturing Belgium BVBA+:::EGGESTR 1++++BE'
RFF+VA:BE0838369020'
NAD+DP+::9++LABO PRINGLES+:::HOMBEEKSESTWG 323'
CUX+2:EUR:4'
因此,我想在NAD+SU、NAD+PS上搜索,如果可以找到if+::::则将包含BGM的行写入新文件或打印屏幕,该行始终位于下面的第4行。 谢谢


使用“查找”打印存档文件的列表-有20000个文件,可能会出现参数列表过长的错误。假设GNU find for-print0操作。

使用GNU awk for multi char RS,这应该可以做到:

$ awk -v RS='^$' -F'\n' '/(^|\n)NAD\+(SU|PS)[^\n]*\+:::/{ print FILENAME, $4 }' file1 ... file20000
或者,如果您愿意:

$ find <whatever> | xargs awk -v RS='^$' -F'\n' '/(^|\n)NAD\+(SU|PS)[^\n]*\+:::/{ print FILENAME, $4 }'

如果不需要在每个输出行之前打印文件名,请删除文件名。使用find-print0 | xargs-0awk。。。如果文件名可以包含换行符。

这里有一个awk脚本,它使用来自find的多个文件执行:

find . -name 'file.pattern' -execdir awk '
  FNR==4 {bgm = $0}
  FNR==8 && index($0, "+:::") ||
  FNR==11 && index($0, "+:::") {print bgm}
' {} +

awk脚本思想简单,假设行号在所有文件中都不会改变。如果有,用Ed Morton的脚本代替。

我看不出BGM行上方有+::4行。请简化/澄清您的样本数据。另外,S.O.并不是一个免费的编码服务,你需要发布一个试图解决你的问题的帖子,或者至少解释一下你遇到的问题。也就是说,祝你好运!你好,方舱,我使用grep的水平只有这种格式grep-il-NAD+SU-grep-il-NAD+PS*20140728*是的,这里没有特定于shell的内容。
find . -name 'file.pattern' -execdir awk '
  FNR==4 {bgm = $0}
  FNR==8 && index($0, "+:::") ||
  FNR==11 && index($0, "+:::") {print bgm}
' {} +