날짜를 기준으로 파일을 분할하고 금액의 합계와 개수로 트레일러를 추가합니다.

사냥꾼

소스 파일 :

  • 헤더는 H
  • 예고편은 T
  • R로 시작하는 기록
  • 구분자 |~^

입력 파일 샘플

  • R로 시작하는 입력 레코드에는 원본 소스 파일에 여러 필드가 있습니다. 여기에서는 샘플의 5 개 필드를 언급했습니다.

  • 트레일러 레코드 세 번째 열에는 레코드 수가 있고 다섯 번째 열은 금액 열의 합계입니다 (세 번째 열 또는 레코드 줄)

  • 분할 후에는 개수 및 합계 열이있는 아래 형식으로 새 파일에 트레일러를 추가해야합니다.

  • R로 시작하는 INPUT 레코드는 날짜 순서 순서를 따르지 않습니다. 예 : 1st rec는 2019-03-05 rec이 있고 마지막 기록도 같은 날짜입니다.

노트:

  • R로 시작하는 INPUT 레코드에는 여러 열에 날짜 필드가 있으므로 분할을 위해 세 번째 날짜 필드를 고려하십시오.

  • 또한 날짜 필드의 타임 스탬프를 무시하십시오 . 날짜 만 고려하고 날짜 만 기준으로 분할을 수행 할 수 있습니다. 이상적으로는 세 번째 열에있는 모든 동일한 날짜의 트랜잭션을 새 파일로 이동하고 합계 및 개수와 함께 헤더 / 트레일러를 추가해야합니다. **** EDIT ****** 내 질문은 동일하게 유지되지만 금액 필드가 매우 큰 경우 (금액 필드 데이터 유형이 소수점이 최대 5 포인트가 될 수있는 Number (31,5)라고 생각해보십시오. 소수점 이하 5 자리 만있는 금액이있는 경우 매번 (31,5)가되는 것은 아닙니다. 그러면 값은 소수점 이하 5 자리까지입니다.)

입력 파일:

H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-06T12:33:52.27|~^123562388.23456|~^2018-04-12T12:33:52.27|~^hhh
R|~^abc|~^2019-03-05T12:33:52.27|~^105603.042|~^2018-10-23T12:33:52.27|~^aus
R|~^abc|~^2019-03-05T12:33:52.27|~^2054.026|~^2018-10-24T12:33:52.27|~^usa
R|~^abc|~^2019-03-06T12:33:52.27|~^10.00|~^2018-09-11T12:33:52.27|~^virginia
R|~^abc|~^2019-03-05T12:33:52.27|~^30.00|~^2018-08-05T12:33:52.27|~^ddd
R|~^abc|~^2019-03-06T12:33:52.27|~^15.03|~^2018-10-23T12:33:52.27|~^jjj
R|~^abc|~^2019-03-06T12:33:52.27|~^10.04|~^2018-04-08T12:33:52.27|~^jj
R|~^abc|~^2019-03-05T12:33:52.27|~^20.00|~^2018-07-23T12:33:52.27|~^audg
T|~^20200425|~^8|~^xxx|~^123670130.37256

예상 출력

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

H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-05T12:33:52.27|~^105603.042|~^2018-10-23T12:33:52.27|~^aus
R|~^abc|~^2019-03-05T12:33:52.27|~^2054.026|~^2018-10-24T12:33:52.27|~^usa
R|~^abc|~^2019-03-05T12:33:52.27|~^30.00|~^2018-08-05T12:33:52.27|~^ddd
R|~^abc|~^2019-03-05T12:33:52.27|~^20.00|~^2018-07-23T12:33:52.27|~^audg
T|~^20200425|~^4|~^xxx|~^107707.068

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

H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-06T12:33:52.27|~^123562388.23456|~^2018-04-12T12:33:52.27|~^hhh
R|~^abc|~^2019-03-06T12:33:52.27|~^10.00|~^2018-09-11T12:33:52.27|~^virginia
R|~^abc|~^2019-03-06T12:33:52.27|~^15.03|~^2018-10-23T12:33:52.27|~^jjj
R|~^abc|~^2019-03-06T12:33:52.27|~^10.04|~^2018-04-08T12:33:52.27|~^jj
T|~^20200425|~^4|~^xxx|~^123562423.30456
멘돈

awk해결책은 다음과 같습니다 .

awk -F'\\|~\\^' '{ 
            if($1=="H"){ 
                head=$0
            }
            else if($1=="T"){
                foot=$1"|~^"$2
                foot4=$4
            }
            else{
                date=$3;
                sub("T.*","", date);
                data[date][NR]=$0;
                sum[date]+=$4; 
                num[date]++
            }
           }
           END{
            for(date in data){
                file=date".txt";
                gsub("-","",file); 
                print head > file; 
                for(line in data[date]){
                    print data[date][line] > file
                } 
                printf "%s|~^%.3f|~^%s|~^%.3f\n", foot, num[date], 
                                              foot4, sum[date] > file
            }
           }' file 

예제 데이터에서 실행하면 다음이 생성됩니다.

$ cat 20190305.txt
H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-05T12:33:52.27|~^105603.042|~^2018-10-23T12:33:52.27|~^aus
R|~^abc|~^2019-03-05T12:33:52.27|~^2054.026|~^2018-10-24T12:33:52.27|~^usa
R|~^abc|~^2019-03-05T12:33:52.27|~^30.00|~^2018-08-05T12:33:52.27|~^ddd
R|~^abc|~^2019-03-05T12:33:52.27|~^20.00|~^2018-07-23T12:33:52.27|~^audg
T|~^20200425|~^4.000|~^xxx|~^107707.068

$ cat 20190306.txt
H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-06T12:33:52.27|~^123562388.23456|~^2018-04-12T12:33:52.27|~^hhh
R|~^abc|~^2019-03-06T12:33:52.27|~^10.00|~^2018-09-11T12:33:52.27|~^virginia
R|~^abc|~^2019-03-06T12:33:52.27|~^15.03|~^2018-10-23T12:33:52.27|~^jjj
R|~^abc|~^2019-03-06T12:33:52.27|~^10.04|~^2018-04-08T12:33:52.27|~^jj
T|~^20200425|~^4.000|~^xxx|~^123562423.305

또한 awk가 느리다고 생각하는 것 같기 때문에 대용량 파일에서 테스트했습니다. 내 테스트 파일을 만들기 위해 다음을 실행했습니다.

perl -e '@d=<>; print $d[0]; $str=join("",@d[1..$#d-1]); print $str x 3500000; print $d[$#d]' file > bigFile

이렇게하면 28000002 줄의 1.9G 파일이 생성됩니다. 여기서 첫 번째 줄은 원본 파일의 헤더이고 마지막 줄은 원본의 바닥 글이며 그 사이의 줄은 원본 파일 콘텐츠의 350 만 반복입니다. 그런 다음이 파일에 대해 awk를 실행했습니다 (이에 충분한 RAM이 있으므로 최소 618M의 여유 RAM이 필요합니다).

$ time awk -F'\\|~\\^' '{ if($1=="H"){head=$0} else if($1=="T"){foot=$1"|~^"$2; foot4=$4;} else{date=$3; sub("T.*","", date);data[date][NR]=$0;sum[date]+=$4;num[date]++;} }END{for(date in data){file=date;gsub("-","",file); sub("T.*",".txt",file); print head > file; for(line in data[date]){print data[date][line] > file} printf "%s|~^%s|~^%s|~^%s\n", foot, num[date], foot4, sum[date] > file } }' bigFile 

real    2m8.603s
user    2m0.610s
sys     0m6.795s

따라서 28,000,002 라인에서 1.9G의 데이터를 처리하는 데 2 ​​분이 걸립니다. 그것은 꽤 빠릅니다 ( Isaac의 솔루션 은 1m 30에서 더 빠르고 메모리를 덜 사용하므로 UI는 대신 사용하는 것이 좋습니다). for루프를 사용하면 이렇게 빨리 얻을 수 없을 것 입니다. 또한 R for 루프도 마찬가지입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Pandas는 날짜를 기준으로 행을 추가합니다.

분류에서Dev

날짜를 기준으로 스프레드 시트의 행을 삭제하려고합니다.

분류에서Dev

여러 파일을 단일 파일로 결합하고 각 파일 이름의 일부를 추가합니다.

분류에서Dev

날짜를 기준으로 2 개의 테이블을 결합하는 방법

분류에서Dev

MySQL에서 작업 시작 날짜와 종료 날짜를 기준으로 분기당 값의 합계를 계산하는 방법은 무엇입니까?

분류에서Dev

AWK : 주요 날짜와 최신 날짜를 기준으로 두 파일 병합

분류에서Dev

Excel 스프레드 시트를 날짜 열을 기준으로 별도의 파일로 분할

분류에서Dev

Java는 열 날짜를 기준으로 csv 파일을 정렬합니다.

분류에서Dev

특정 패턴으로 로그 파일에서 2 개의 날짜를 추출하고 2 개의 날짜를 비교합니다.

분류에서Dev

파일 이름의 날짜를 기준으로 파일을 폴더로 정렬 하시겠습니까?

분류에서Dev

현재 날짜와 이전 날짜를 기준으로 수량 합계를 표시하려면

분류에서Dev

날짜를 기준으로 Google 시트 합계 및 곱하기

분류에서Dev

파이썬 팬더는 날짜 열을 기준으로 일 수를 계산합니다.

분류에서Dev

다른 열을 기준으로 순서를 일치시키고 결 측값에 0을 추가하면서 여러 파일의 열 결합

분류에서Dev

파일의 5 번째 열 값을 기준으로 .CSV 파일을 필터링하고 해당 레코드를 새 파일로 인쇄합니다.

분류에서Dev

날짜를 기준으로 저장된 주어진 텍스트 파일에서 각 단어의 발생 횟수를 계산합니다.

분류에서Dev

개수를 기준으로 색인을 추가하여 두 개의 자바 스크립트 배열 객체를 병합합니다.

분류에서Dev

Pandas의 다른 날짜 열과 첫 번째 날짜를 기준으로 시간을 일 단위로 계산합니다.

분류에서Dev

특정 기준에 대한 두 열의 부분 합계와 X 매개 변수에 의해 전체 그룹으로 다른 합계를 가져옵니다.

분류에서Dev

일부 범위와 평균 값 사이의 경우 날짜를 기준으로 두 개의 df 병합

분류에서Dev

최신 날짜를 기준으로 한 항목의 LINQ 합계

분류에서Dev

마지막 수정 날짜를 기준으로 디렉토리의 파일을 재귀 적으로 정렬합니다.

분류에서Dev

날짜를 기준으로 두 개의 SQL 테이블을 일치시켜야하지만 date + 1을 확인해야합니다.

분류에서Dev

Mongo MQL은 날짜별로 그룹화하고 다른 필드 값의 개수를 추가합니다.

분류에서Dev

날짜와 기호를 기준으로 두 테이블의 두 열을 여러 개로 다른 테이블의 여러 값을 업데이트하려고합니다.

분류에서Dev

모바일 날짜를 기준으로 활동을로드합니다. Eclipse 앱

분류에서Dev

Lua-밝기 수준을 기준으로 전구가 사용하는 와트를 계산합니까?

분류에서Dev

Laravel은 로그 파일에 날짜를 추가합니다.

분류에서Dev

다른 셀의 날짜를 기준으로 셀을 요약하려면 어떻게해야합니까?

Related 관련 기사

  1. 1

    Pandas는 날짜를 기준으로 행을 추가합니다.

  2. 2

    날짜를 기준으로 스프레드 시트의 행을 삭제하려고합니다.

  3. 3

    여러 파일을 단일 파일로 결합하고 각 파일 이름의 일부를 추가합니다.

  4. 4

    날짜를 기준으로 2 개의 테이블을 결합하는 방법

  5. 5

    MySQL에서 작업 시작 날짜와 종료 날짜를 기준으로 분기당 값의 합계를 계산하는 방법은 무엇입니까?

  6. 6

    AWK : 주요 날짜와 최신 날짜를 기준으로 두 파일 병합

  7. 7

    Excel 스프레드 시트를 날짜 열을 기준으로 별도의 파일로 분할

  8. 8

    Java는 열 날짜를 기준으로 csv 파일을 정렬합니다.

  9. 9

    특정 패턴으로 로그 파일에서 2 개의 날짜를 추출하고 2 개의 날짜를 비교합니다.

  10. 10

    파일 이름의 날짜를 기준으로 파일을 폴더로 정렬 하시겠습니까?

  11. 11

    현재 날짜와 이전 날짜를 기준으로 수량 합계를 표시하려면

  12. 12

    날짜를 기준으로 Google 시트 합계 및 곱하기

  13. 13

    파이썬 팬더는 날짜 열을 기준으로 일 수를 계산합니다.

  14. 14

    다른 열을 기준으로 순서를 일치시키고 결 측값에 0을 추가하면서 여러 파일의 열 결합

  15. 15

    파일의 5 번째 열 값을 기준으로 .CSV 파일을 필터링하고 해당 레코드를 새 파일로 인쇄합니다.

  16. 16

    날짜를 기준으로 저장된 주어진 텍스트 파일에서 각 단어의 발생 횟수를 계산합니다.

  17. 17

    개수를 기준으로 색인을 추가하여 두 개의 자바 스크립트 배열 객체를 병합합니다.

  18. 18

    Pandas의 다른 날짜 열과 첫 번째 날짜를 기준으로 시간을 일 단위로 계산합니다.

  19. 19

    특정 기준에 대한 두 열의 부분 합계와 X 매개 변수에 의해 전체 그룹으로 다른 합계를 가져옵니다.

  20. 20

    일부 범위와 평균 값 사이의 경우 날짜를 기준으로 두 개의 df 병합

  21. 21

    최신 날짜를 기준으로 한 항목의 LINQ 합계

  22. 22

    마지막 수정 날짜를 기준으로 디렉토리의 파일을 재귀 적으로 정렬합니다.

  23. 23

    날짜를 기준으로 두 개의 SQL 테이블을 일치시켜야하지만 date + 1을 확인해야합니다.

  24. 24

    Mongo MQL은 날짜별로 그룹화하고 다른 필드 값의 개수를 추가합니다.

  25. 25

    날짜와 기호를 기준으로 두 테이블의 두 열을 여러 개로 다른 테이블의 여러 값을 업데이트하려고합니다.

  26. 26

    모바일 날짜를 기준으로 활동을로드합니다. Eclipse 앱

  27. 27

    Lua-밝기 수준을 기준으로 전구가 사용하는 와트를 계산합니까?

  28. 28

    Laravel은 로그 파일에 날짜를 추가합니다.

  29. 29

    다른 셀의 날짜를 기준으로 셀을 요약하려면 어떻게해야합니까?

뜨겁다태그

보관