【问题标题】:Extracting pattern which does not necessarily repeat提取不一定重复的模式
【发布时间】:2015-03-20 16:31:28
【问题描述】:

我正在使用 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”段,并将该文件中的所有段写入我的输出文件。

【问题讨论】:

  • 您能展示一些示例输入吗?特别是,问题指出“给定文件是单行”,但您的示例代码会竭尽全力删除换行符。此外,示例代码会查找包含 from 的行,但您的描述没有提及为什么 from 很重要。一些示例输入可能有助于澄清。
  • sed 对于这项工作来说是 100% 错误的工具,所以扔掉这个 sed 脚本,因为它使用的大多数结构在 1907 年代中期当 awk 被发明时已经过时,并通过发布一些示例输入重新开始和预期的输出。
  • 你可以使用 COBOL 吗?我认为这种语言在这个问题领域很受欢迎。
  • John Zwinck:不幸的是,COBOL 不是。

标签: linux bash awk sed plaintext


【解决方案1】:

试试awk:

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

【讨论】:

  • awk 确实会添加文件名。它仍然没有写任何段超过第一个。给定文件是没有 CRLF 的单行。上面还有其他 cmets。
猜你喜欢
  • 2020-11-02
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多