输入文件的日期块每4行更改一次(列1)。例为061218和061418,但日期为061318 的情况却并非如此,该行包含8行。
然后,如果日期在5行之后没有更改,例如日期为061318的示例,则第二部分 5-8行的值需要添加到END中第1-4行。为了正确获取所需的输出文件。
输入文件
061218,2660,2660,2661
061218,0,0,0,0
061218,48,30,569
061218,SD/05,F1/R0,SD/05
061318,2654,2654
061318,0,0
061318,114,60
061318,SD/05,F1/R0
061318,2666
061318,0
061318,1
061318,F1/R0
061418,2648,2648,2649
061418,0,0,0
061418,871,868,876
061418,SD/05,F1/R0,SD/05
输出文件
061218,2660,2660,2661
061218,0,0,0,0
061218,48,30,569
061218,SD/05,F1/R0,SD/05
061318,2654,2654,2666
061318,0,0,0
061318,114,60,1
061318,SD/05,F1/R0,F1/R0
061418,2648,2648,2649
061418,0,0,0
061418,871,868,876
061418,SD/05,F1/R0,SD/05
我尝试过:
awk -F, '{a[$1]=a[$1]?a[$1]","$2:$2;}END{for (i in a)print i, a[i];}' OFS=, file
预先感谢
答案 0 :(得分:2)
如果您的Input_file与显示的示例相同(您在注释中提到的是),那么您可以尝试以下操作。
awk '
BEGIN{
FS=OFS=","
}
prev!=$1 && prev{
for(i=1;i<=count;i++){
print prev,a[prev,i]
}
prev=count=""
}
{
prev=$1
sub(/[^,]*,/,"")
if(count==4){
count=1
}
else{
count++
}
a[prev,count]=a[prev,count]?a[prev,count] OFS $0:$0
}
END{
if(prev){
for(i=1;i<=count;i++){
print prev,a[prev,i]
}
}
}' Input_file
也将埃德·莫顿爵士的风格在a[prev,count]
行上方更改为a[prev,count]=(a[prev,count]?a[prev,count] OFS:"")$0
,以缩短并使其与其他awk
兼容。