열 내용을 기반으로 파일을 별도의 파일로 분할 + 각 새 파일에 헤더 및 총 레코드 수 추가 [닫기]

열 내용을 기반으로 파일을 별도의 파일로 분할 + 각 새 파일에 헤더 및 총 레코드 수 추가 [닫기]
  • 헤더는 H로 시작합니다.
  • 예고편은 T로 시작합니다.
  • R로 시작하는 레코드
  • "|"로 구분됨

입력 파일 샘플

  • 트레일러 레코드의 세 번째 열은 레코드 수, 네 번째 열은 금액 열의 합계입니다.
  • 분할 후 예고편은 개수 및 합계 열이 포함된 다음 형식으로 새 파일에 추가되어야 합니다.
  • INPUT 레코드는 날짜 순서를 따르지 않습니다. 예를 들어 첫 번째 레코드는 2019-03-05로 기록되고 마지막 레코드도 같은 날짜입니다.

입력 파일:

H|20200425|abcd|sum
R|abc|2019-03-05|10.00
R|abc|2019-03-05|20.00
R|abc|2019-03-06|10.00
R|abc|2019-03-05|30.00
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
R|abc|2019-03-05|30.00
T|20200425|8|225.00

예상 출력

파일 1: 다음 이름으로 저장해야 합니다.20190305.txt

H|20200425|abcd|sum
R|abc|2019-03-05|10.00
R|abc|2019-03-05|20.00
R|abc|2019-03-05|30.00
R|abc|2019-03-05|30.00
T|20200425|4|90.00

파일 2: 다음 이름으로 저장해야 합니다.20190306.txt

H|20200425|abcd|sum
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
R|abc|2019-03-06|10.00
T|20200425|4|135.00

답변1

또 다른 awk솔루션

awk -F'[|]' '
     $1=="H"{h=$0"sum"; next}
     $1=="R"{o=$3".txt";gsub("-","",o);
           if (! sum[o]) print h > o; 
           printf ("%s|%s|%s|%.2f\n", $1, $2, $3, $4) > o; sum[o]+=$4; c[o]++}
     $1=="T"{for (o in sum) printf ("%s|%s|%d|%.2f\n", $1, $2, c[o], sum[o]) > o}' file;
tail -n +1 2019*.txt

산출

==> 20190305.txt <==
H|20200425|abcd|sum
R|abc|2019-03-05|10.00
R|abc|2019-03-05|20.00
R|abc|2019-03-05|30.00
T|20200425|3|60.00

==> 20190306.txt <==
H|20200425|abcd|sum
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
T|20200425|3|125.00

송곳

FS로 설정|

awk -F'[|]' '

헤더 행인 경우 캡처하고 누락된 텍스트를 추가한 후 다음 행으로 이동합니다.

     $1=="H"{h=$0"sum"; next}

레코드인 경우 잡아서 $3".txt"제거하여 -출력 파일 이름을 얻습니다.

     $1=="R"{o=$3".txt";gsub("-","",o);

이 출력 파일의 합계 배열이 아직 초기화되지 않은 경우 print파일 헤더는

           if (! sum[o]) print h > o; 

출력 형식을 지정하고 마지막 필드를 수정한 후 printf관련 파일에 저장합니다.

           printf ("%s|%s|%s|%.2f\n", $1, $2, $3, $4) > o;

파일 이름을 색인으로 사용하여 이 출력 파일의 sum레코드 수를 업데이트합니다.c

           sum[o]+=$4; c[o]++}

tail-end인 경우 sum 배열을 반복하여 printf파일 이름을 복구하고 각 출력 파일과 관련된 요약 줄을 작성합니다.o

     $1=="T"{for (o in sum) printf ("%s|%s|%d|%.2f\n", $1, $2, c[o], sum[o]) > o}' file;

출력 표시

tail -n +1 2019*.txt

답변2

당신은 이것을 할 수 있습니다 awk:

if($0 ~ /^$/){next};→ 빈 줄을 무시

if(NR==1){hd=$0;h=1;next}→ 매장명'HD'변수를 지정하고 구문 분석을 위해 다음 줄로 이동합니다.

f=$3$4$5→ 파일 이름을 다음에 저장하십시오.'에프'변수("-"도 구분자이므로 해당 값은 구분되어 사용 가능)n ${3,4,5}각기. 마지막으로 인쇄 프로세스 중에 ".txt"를 추가합니다.

awk -F'[|-]' '{
    if($0 ~ /^$/){next};
    if(NR==1){hd=$0;h=1;dt=$2;next}
    f=$3$4$5;sum+=$6;c++;
    if ( dval != f ) { h=1;printf "%s|%s|%s|%.2f\n","T",dt,c,v6 >> dval".txt";temp=$6;sum=0;c=0};
    if ($0 ~ /^T/ ) { next; }
    if ($0 ~ /^R/ ){v6=sum+temp;}
    if(h){print hd"\n\n"$0"\n" > f".txt"; h=0;}else{ print $0"\n" >> f".txt";}dval=f;
    }' inputFile

산출:

$ cat 20190305.txt 
H|20200425|abcd|sum
R|abc|2019-03-05|10.00    
R|abc|2019-03-05|20.00
R|abc|2019-03-05|30.00
T|20200425|3|60.00

$ cat 20190306.txt 
H|20200425|abcd|sum
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
T|20200425|3|125.00

답변3

다음을 시도해 볼 수 있습니다.

awk -F'|' '
  # get the 2nd field of the header
  NR == 1 { 
    a = $2 
    h = $0
    next
  } 
  # get the date formatted
  NR == 2 { 
    d = $3; gsub(/-/,"",d) 
    print h > d
  } 
  # if the line starts with 'R', sum the column and get the count of them
  $1 == "R" { 
    sum += $4
    ++c 
  } 
  {
    print > d
  }
  # print the final line with variables acquired
  END { 
    OFS = "|"; print "T",a,c,sum".00" > d
  }
' file

산출:

$ cat 20190305.txt 
H|20200425|abcd|sum
R|abc|2019-03-05|10.00    
R|abc|2019-03-05|20.00
R|abc|2019-03-05|30.00
T|20200425|3|60.00

$ cat 20190306.txt 
H|20200425|abcd|sum
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
T|20200425|3|125.00

관련 정보