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'을 포함하는 행을 찾고'description'가 왜 중요한지에 대한 언급을하지 않습니다. 일부 샘플 입력은 명확히하는 데 도움이 될 수 있습니다. – John1024

+1

sed는이 작업에 대한 잘못된 도구이므로 100 %입니다. awk가 개발 된 1907 년 중반에 사용되는 대부분의 구문이 쓸모 없게되고 일부 샘플 입력과 예상 출력을 게시하여 다시 시작하므로 sed 스크립트를 버리십시오. –

+0

COBOL을 사용할 수 있습니까? 언어가이 문제 영역에서 인기가 있다고 생각합니다. –

답변

1

awk으로 시도 :

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

awk가 파일 이름 앞에 추가합니다. 아직 첫 번째 세그먼트를 작성하지 않습니다. 주어진 파일은 CRLF가없는 단일 행입니다. 위의 추가 의견. – rcfrank