【发布时间】: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