先前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
答案 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
这将保留输出,但期望数据按顺序排列。它不会将整个文件存储在内存中。一旦产品或年份发生变化,它将立即打印。