根据行值将值移至列

时间:2018-08-11 08:49:48

标签: awk

输入文件的日期块每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

预先感谢

1 个答案:

答案 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兼容。