- 헤더는 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