使用GAWK将类似报告的矩阵转换为列

时间:2014-03-07 19:13:32

标签: csv awk

我是awk的新手,并尝试将CS​​V格式的报告转换为表格格式。

这是我输入文件的样子。

Object,CompanyA,CompanyB,CompanyC
10001,100.50,200.00,250.00
10002,0,100.00,130.00
10003,0,200.00,175.00

这就是它的样子。

Object,Company,Amount
10001,CompanyA, 150.00
10002,CompanyA, 0
10003,CompanyA, 0
10001,CompanyB, 200.00
10002,CompanyB, 100.00
10003,CompanyB, 200.00
10001,CompanyC, 250.00
10002,CompanyC, 130.00
10003,CompanyC, 175.00

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这可以在传统的awk中完成,不需要gawk。

$ awk -F, 'BEGIN{OFS=","} NR==1{for(i=2;i<=NF;i++){name[i]=$i}} NR>1{for(i=2;i<=NF;i++){print $1,name[i],$i;}}' inputfile.txt

让我们分开以便于阅读。如果它是一个独立的脚本,它可能如下所示:

#!/usr/bin/awk -f

BEGIN {
    FS=",";
    OFS=",";
}

# On the first line, gather field names from the column heads...
NR==1 {
    for (i=2;i<=NF;i++) {
        name[i]=$i;
    }
}

# And on subsequent lines, walk through the fields and print output for each.
NR>1 {
    for (i=2;i<=NF;i++) {
        print $1,name[i],$i;
    }
}

如果希望输出按第二列排序,如示例所示,则可以使用sort命令:

$ awk '...' inputfile.txt | sort -t, -k2

请注意,排序-k选项可让您为排序指定开始和结束位置,但不能指定辅助排序。因此,如果您希望输出像您的示例一样排序,则需要更多工具。 :)

答案 1 :(得分:2)

gawk '
BEGIN { FS=OFS="," }
{ vals[NR][1]; split($0,vals[NR]) }
END {
    print vals[1][1], "Company", "Amount"
    for (fld=2;fld<=NF;fld++) {
        for (rec=2;rec<=NR;rec++) {
            print vals[rec][1], vals[1][fld], vals[rec][fld]
        }
    }
}
' file
Object,Company,Amount
10001,CompanyA,100.50
10002,CompanyA,0
10003,CompanyA,0
10001,CompanyB,200.00
10002,CompanyB,100.00
10003,CompanyB,200.00
10001,CompanyC,250.00
10002,CompanyC,130.00
10003,CompanyC,175.00

使用其他awks,你只需在字段的循环中填充val [NR]而不是使用split(),你可以使用val [a,b]而不是val [a] [b]语法:< / p>

awk '
BEGIN { FS=OFS="," }
{ for (fld=1; fld<=NF; fld++) vals[NR,fld] = $fld }
END {
    print vals[1,1], "Company", "Amount"
    for (fld=2;fld<=NF;fld++) {
        for (rec=2;rec<=NR;rec++) {
            print vals[rec,1], vals[1,fld], vals[rec,fld]
        }
    }
}
' file
Object,Company,Amount
10001,CompanyA,100.50
10002,CompanyA,0
10003,CompanyA,0
10001,CompanyB,200.00
10002,CompanyB,100.00
10003,CompanyB,200.00
10001,CompanyC,250.00
10002,CompanyC,130.00
10003,CompanyC,175.00