2017-08-17 37 views
0

我有一个CSV文件,在这里与3场和第三场,我想对行分组到不超过25
鉴于组总结行“;(PE.502); 24
”CW-04“;(PE.501); 25
”CW-05“;(PE.518,PE.518-1); 2
”CW- 06“;(PE.517); 1
”CW-07“;(PE.516); 3
”CW-08“;(PE.515); 1
”CW-09“; .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- (PE.509);
“CW-15”;(PE.508,PE.508-1); (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“;(PE.526,PE.526- 1,PE.574 ,PE.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);
“CW-04”;(PE.501);
“CW-05”; (PE.518,PE.518-1,PE.517,PE.516,PE.515,PE.514); 8
“CW-10”;(PE.513,PE.513-1) ;
“CW-11”; (PE.509,PE.510,PE.511,PE.512); 15

你能帮我吗?awk中如何能在40

+0

这可能是凌晨在这里,但我真的不明白你是如何达到理想的输出。请澄清。 –

回答

0

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 
+0

谢谢。有效。 – jiggens

+0

@ jiggens,你试过接受答案吗? – RomanPerekhrest

+0

是的。我试了一下,接受了答案。谢谢。 – jiggens

1
$ 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