另一个awk转置,多列但转置最后一列

时间:2014-03-20 21:48:03

标签: awk

先前awk转换问题的皱纹。我想使用awk转置以下内容。皱纹是仅转换第4列(并且可以删除第3列)。分隔符是标签:

来源(实际来源有52周和数百万行):

2014 Product1 WK01 333.33
2014 Product1 WK02 222.33
2014 Product1 WK03 344.33
2014 Product2 WK01 10.33
2014 Product2 WK02 55.10
2014 Product2 WK03 20.33

转置为(不需要一周的标题行):

2014 Product1 333.33 222.33 344.33
2014 Product2 10.33 55.10 20.33

2 个答案:

答案 0 :(得分:1)

这是一个awk

awk '{a[$1 FS $2]=a[$1 FS $2] FS $4} END {for (i in a) print i,a[i]}' file
2014 Product1  333.33 222.33 344.33
2014 Product2  10.33 55.10 20.33

它使用字段#1和#2作为数组中的索引,然后将字段#4添加为数据 最后它全部打印出来。

如果您不喜欢产品后的额外空间,请使用:

awk '{a[$1 FS $2]=a[$1 FS $2]?a[$1 FS $2] FS $4:$4} END {for (i in a) print i,a[i]}' file
2014 Product1 333.33 222.33 344.33
2014 Product2 10.33 55.10 20.33

答案 1 :(得分:1)

以下是awk中的另一种方式:

$ awk '
BEGIN { FS = OFS = "\t" }
$1==year && $2==product { line = line FS $NF; next }
{
    if (line) { print year, product, line }
    line = $NF; year = $1; product = $2
}
END { 
    print year, product, line
}' file
2014 Product1 333.33 222.33 344.33
2014 Product2 10.33 55.10 20.33

这将保留输出,但期望数据按顺序排列。它不会将整个文件存储在内存中。一旦产品或年份发生变化,它将立即打印。