提取不一定重复的模式

时间:2015-01-22 00:20:34

标签: linux bash awk sed plaintext

我正在使用ANSI 835纯文本文件,我希望捕获以“BPR”开头并以“TRN”结尾的段中的所有数据,包括那些标记。给定文件是单行;在该行内,该段可以(但不总是)重复。我一次在多个文件上运行该过程,理想情况下,我将能够记录段发生的文件名。 以下是我目前所基于的answer to another question

#!/bin/sed -nf
/BPR.*TRN/ {
   s/.*\(BPR.*TRN\).*/\1/p
   d
 }
 /from/ {
     : next
     N
     /BPR/ {
        s/^[^\n]*\(BPR.*TRN\)[^n]*/\1/p
        d
      }
      $! b next
}

我运行我拥有的所有文件,并将结果写入一个如下所示的文件:

BPR*I*393.46*C*ACH*CCP*01*011900445*DA*0000009046*1066033492**01*071923909*DA*72
34692932*20150120~TRN
BPR*I*1611.07*C*ACH*CCP*01*031100209*DA*0000009108*1066033492**01*071923909*DA*7
234692932*20150122~TRN
BPR*I*1415.25*C*CHK************20150108~TRN
BPR*H*0*C*NON************20150113~TRN
BPR*I*127.13*C*CHK************20150114~TRN
BPR*I*22431.28*C*ACH*CCP*01*071000152*DA*99643*1361236610**01*071923909*DA*72346
92932*20150112~TRN
BPR*I*182.62*C*ACH*CCP*01*071000152*DA*99643*1361236610**01*071923909*DA*7234692
932*20150115~TRN

理想情况下,每一行都会附加文件名,如下所示:

IDI.Aetna.011415.64539531.rmt:BPR*I*393.46*C*ACH*CCP*01*011900445*DA*0000009046*1066033492**01*071923909*DA*72
34692932*20150120~TRN
IDI.BCBSIL.010915.6434438.rmt:BPR*I*1611.07*C*ACH*CCP*01*031100209*DA*0000009108*1066033492**01*071923909*DA*7
234692932*20150122~TRN
IDI.CIGNA.010215.64058847.rmt:BPR*I*1415.25*C*CHK************20150108~TRN
IDI.GLDRULE.011715.646719.rmt:BPR*H*0*C*NON************20150113~TRN
IDI.MCREIN.011915.6471442.rmt:BPR*I*127.13*C*CHK************20150114~TRN
IDI.UHC.011915.64714417.rmt:BPR*I*22431.28*C*ACH*CCP*01*071000152*DA*99643*1361236610**01*071923909*DA*72346
92932*20150112~TRN
IDI.UHC.011915.64714417.rmt:BPR*I*182.62*C*ACH*CCP*01*071000152*DA*99643*1361236610**01*071923909*DA*7234692
932*20150115~TRN

最后两行是重复段模式的文件示例。

同样,在每行前加上文件名是理想的。我真正需要的是能够处理给定单行文件,该文件具有“BPR ... TRN”段重复并将该文件中的所有段写入我的输出文件。

1 个答案:

答案 0 :(得分:1)

尝试awk

awk '
    /BPR/ { sub(".*BPR","BPR") }
    /TRN/ { sub("TRN.*","TRN") }
    /BPR/,/TRN/ { print FILENAME ":" $0 }
' *.rmt