【问题标题】:Another awk transpose, multiple columns but transpose last one另一个 awk 转置,多列但转置最后一个
【发布时间】:2014-03-21 06:23:58
【问题描述】:

之前的 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

【问题讨论】:

    标签: awk


    【解决方案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
    

    【讨论】:

    • 这太棒了 Jotne。像魅力一样工作。最终代码(添加额外的列和制表符分隔符):$(UnixUtil_Dir)gawk.exe "BEGIN{FS=\"\t\"}{a[$1 FS $2 FS $3 FS $4 FS $5 FS $6 FS $7 FS $8 FS $9]=a[$1 FS $2 FS $3 FS $4 FS $5 FS $6 FS $7 FS $8 FS $9] FS $11} END {for (i in a) print i,a[i]}" input.txt > output.txt
    【解决方案2】:

    这是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
    

    这将保留输出,但希望数据是有序的。它不会将整个文件存储在内存中。它会在产品或年份发生变化时立即打印。

    【讨论】:

      猜你喜欢
      • 2018-03-13
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 2012-01-15
      • 2021-10-13
      相关资源
      最近更新 更多