我是awk的新手,并尝试将CSV格式的报告转换为表格格式。
这是我输入文件的样子。
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
非常感谢任何帮助。
答案 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