Awk我怎样才能将40行一组的行相加

Awk我怎样才能将40行一组的行相加,awk,Awk,我这里有一个csv文件,有3个字段,在第三个字段中,我想将行分组为不超过25行。 鉴于: CW-03;PE.502;24 CW-04;PE.501;25 CW-05;第518页,第518-1页;2. CW-06;PE.517;1. CW-07;PE.516;3. CW-08;PE.515;1. CW-09;PE.514;1. CW-10;PE.513,PE.513-1;23 CW-11;PE.512;8. CW-12;PE.511;1. CW-13;PE.510;3. CW-14;PE.509;

我这里有一个csv文件,有3个字段,在第三个字段中,我想将行分组为不超过25行。 鉴于: CW-03;PE.502;24 CW-04;PE.501;25 CW-05;第518页,第518-1页;2. CW-06;PE.517;1. CW-07;PE.516;3. CW-08;PE.515;1. CW-09;PE.514;1. CW-10;PE.513,PE.513-1;23 CW-11;PE.512;8. CW-12;PE.511;1. CW-13;PE.510;3. CW-14;PE.509;3. CW-15;PE.508,PE.508-1;17 CW-16;PE.507;1. CW-17;PE.506;1. CW-18;PE.505;1. CW-19;PE.521、PE.569;2. CW-20;PE.520,PE.568;17 CW-21;PE.519、PE.567;17 CW-22;第526页,第526-1页,第574页,第574-1页;4. CW-23;PE.525,PE.573;2. CW-24;PE.524,PE.572;2. CW-25;PE.523,PE.571;3. CW-26;PE.522,PE.522-1,PE.570,PE.570-1;19 期望输出: CW-03;PE.502;24 CW-04;PE.501;25 CW-05;第518页,第518-1页,第517页,第516页,第515页,第514页;8. CW-10;PE.513,PE.513-1;23 CW-11;PE.509、PE.510、PE.511、PE.512;15 你能帮我吗

$ cat awk-script
function print_line(str1,str2,sum)
{
  print str1 OFS "(" str2 ")" OFS sum  # print the format as your request
}
NR==1 {
  str1=$1                              
  str2=$3                              # Use the str2 to store the combined output for $3
  sum=$5                               # Use sum to store the sum of $5
  next
}
{
  sum+=$5
  if (sum>25){                         # If sum is greater than 25
    print_line(str1,str2,sum-$5)       # print the line in the desired format
    str1=$1                            # and reset the str1 to $1
    str2=""                            # str2 to ""
    sum=$5                             # sum to $5
  }
  str2=(str2?str2",":str2"")$3         # update the str2 based on if str2 is ""
}
END {
  print_line(str1,str2,sum)            # flush the final result
}
使用以下命令采用awk脚本:

$ awk -F'[();]' -v OFS=';' -f awk-script file
"CW-03";(PE.502);24
"CW-04";(PE.501);25
"CW-05";(PE.518,PE.518-1,PE.517,PE.516,PE.515,PE.514);8
"CW-10";(PE.513,PE.513-1);23
"CW-11";(PE.512,PE.511,PE.510,PE.509);15
"CW-15";(PE.508,PE.508-1,PE.507,PE.506,PE.505,PE.521,PE.569);22
"CW-20";(PE.520,PE.568);17
"CW-21";(PE.519,PE.567,PE.526,PE.526-1,PE.574,PE.574-1,PE.525,PE.573,PE.524,PE.572);25
"CW-25";(PE.523,PE.571,PE.522,PE.522-1,PE.570,PE.570-1);22
awk解决方案:

awk 'BEGIN{ FS=OFS=";" }
     f{ if(c+$3 > 25) { gsub(/\),\(/,",",r); print r,c; f=c=0 } else { c+=$3; r=r","$2 } }
     !f && c<25{ f=1; c=$3; r=$1 FS $2 }
     END{ if(c) gsub(/\),\(/,",",r); print r,c }' file

这里可能是清晨,但我真的不明白你们是如何达到期望的输出的。请澄清。是的。我试过了,并接受了答案。非常感谢。
"CW-03";(PE.502);24
"CW-04";(PE.501);25
"CW-05";(PE.518,PE.518-1,PE.517,PE.516,PE.515,PE.514);8
"CW-10";(PE.513,PE.513-1);23
"CW-11";(PE.512,PE.511,PE.510,PE.509);15
"CW-15";(PE.508,PE.508-1,PE.507,PE.506,PE.505,PE.521,PE.569);22
"CW-20";(PE.520,PE.568);17
"CW-21";(PE.519,PE.567,PE.526,PE.526-1,PE.574,PE.574-1,PE.525,PE.573,PE.524,PE.572);25
"CW-25";(PE.523,PE.571,PE.522,PE.522-1,PE.570,PE.570-1);22