2015-01-22 3 views
-1

Я работаю с текстовыми файлами 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

ли вы показать некоторые входные выборки? В частности, в этом вопросе говорится, что «данный файл является одной строкой», но ваш образец кода подходит для длин, чтобы удалить символы новой строки. Также пример кода ищет строки, содержащие 'from', но в вашем описании не упоминается, почему' from' является важным. Некоторые примеры ввода могут помочь прояснить. – John1024

+1

sed - это 100% неправильный инструмент для этой работы, поэтому бросьте этот сценарий sed, так как большинство используемых им конструкций стали устаревшими в середине 1907-х годов, когда awk был изобретен и начался снова, отправив некоторый ввод проб и ожидаемый результат. –

+0

Можете ли вы использовать COBOL для этого? Я думаю, что этот язык популярен для этой проблемной области. –

ответ

1

Попробуйте с awk:

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

awk делает предварительное имя файла. Он до сих пор не пишет никаких сегментов за первый. Данный файл представляет собой одну строку без CRLF. Дополнительные комментарии выше. – rcfrank

Смежные вопросы