我必须从'main.csv'文件中读取并打印输出如下:
Set 4,1095,Set 1 or 4
Set 2,18277,Set 2 or 3
Set 1 or 4,Set 4,944
Set 2,1373,Set 2 or 3
Set 4,83,Set 1 or 4
Set 2,14356,Set 2 or 3
Set 2,14800,Set 2 or 3
我在下面尝试了相应的输出:
awk 'BEGIN {FS=","}{OFS=","}{print $12,$15}' main.csv
Set 4,1095
Set 2,18277
Set 4,944
Set 2,1373
Set 4,83
awk 'BEGIN {FS=","}{OFS=","}{if($12 == "Set 1" || $12 == "Set 4"){print "Set 1 or 4",$12,$15}else{print "Set 2 or 3",$12,$15}}' main.csv
Set 1 or 4,Set 4,1095
Set 2 or 3,Set 2,18277
Set 1 or 4,Set 4,944
Set 2 or 3,Set 2,1373
Set 1 or 4,Set 4,83
Set 2 or 3,Set 2,14356
Set 2 or 3,Set 2,14800
awk 'BEGIN {FS=","}{OFS=","}{if($12 == "Set 1" || $12 == "Set 4"){print $12,$15,"Set 1 or 4"}else{print $12,$15,"Set 2 or 3"}}' main.csv
,Set 1 or 4
,Set 2 or 3
,Set 1 or 4
,Set 2 or 3
,Set 1 or 4
,Set 2 or 3
,Set 2 or 3
前2个“awk”运行正常,为什么不是第3个?
main.csv每行有15个逗号分隔值,第12个值为以下任一值:
Set 1
Set 2
Set 3
Set 4
PS:我在Solaris 10上使用bash
我仍然处于“awk”问题的高位,下面是我注意到的......不确定为什么会发生这种情况(我在Solaris 10和RHEL 5上都得到了这个)
awk -F, '{print "Var13->"$13,"\t","Var12->"$12,"\t","Var15 ->"$15}' < main.csv
Var13->0 Var12->Set 4 Var15 ->1095
Var13->1631 Var12->Set 2 Var15 ->18277
Var13->0 Var12->Set 4 Var15 ->944
Var13->2832 Var12->Set 2 Var15 ->1373
Var13->0 Var12->Set 4 Var15 ->83
awk -F, '{print "Var13 & Var15->"$13,"\t","Var12->"$12,"\t","Var15 ->"$15}' < main.csv
Var13 & Var15->0 Var12->Set 4 Var15 ->1095
Var13 & Var15->1631 Var12->Set 2 Var15 ->18277
Var13 & Var15->0 Var12->Set 4 Var15 ->944
Var13 & Var15->2832 Var12->Set 2 Var15 ->1373
Var13 & Var15->0 Var12->Set 4 Var15 ->83
awk -F, '{print "Var13 & Var15->"$13,$15"\t","Var12->"$12,"\t","Var15 ->"$15}' < main.csv
or
awk -F, '{print "Var13 & Var15->"$13,$15,"\t","Var12->"$12,"\t","Var15 ->"$15}' < main.csv
or
awk -F, '{print "Var13 & Var15->"$13,"\t",$15,"\t","Var12->"$12,"\t","Var15 ->"$15}' < main.csv
ar13 & Var12->Set 4 Var15 ->1095
ar13 & Var12->Set 2 27 Var15 ->18277
ar13 & Var12->Set 4 Var15 ->944
ar13 & Var12->Set 2 73 Var15 ->1373
ar13 & Var12->Set 4 Var15 ->83
ar13 & Var12->Set 2 56 Var15 ->14356
正如你所看到的,最后3次运行已经吃掉了“Var13”输出中的字母,并添加了一些垃圾信息。
答案 0 :(得分:3)
无需为此投票,我只想粘贴一些格式化的代码。
你的程序变得越来越大,值得拥有自己的代码文件,它可以以文明的方式进行格式化,并与其他版本进行比较。当我们这样做时,我们可以很容易地看到你在每个输入行的动作中分配OFS。没有伤害,但它显然是无意的,所以你输了 1337 points. 随着这个问题我们继续前进。
你不能区分单行并学习任何东西。格式良好的代码上的 Running diff(1) 表明只有输出行已更改,因此两个程序同样有效。您必须在不同条件下进行第三次运行。也许是一个不同的输入文件?
BEGIN {
FS = ","
OFS = ","
}
{ if($12 == "Set 1" || $12 == "Set 4") {
print "Set 1 or 4",$12,$15
} else {
print "Set 2 or 3",$12,$15
}
}
BEGIN {
FS = ","
OFS = ","
}
{ if($12 == "Set 1" || $12 == "Set 4") {
print $12,$15,"Set 1 or 4"
} else {
print $12,$15,"Set 2 or 3"
}
}
答案 1 :(得分:1)
我的钱在你的“.csv”文件行的末尾有控件-Ms,导致显示行的第一部分被隐藏。
带给您Windows Vista等的人无需支付额外费用即可为您带来这种损坏。
在“.csv”文件上运行“dos2unix”,然后重试。
如果这不起作用,请运行“where awk”和“awk --version”并告诉我们结果。在Solaris上你必须使用/ usr / xpg4 / bin / awk或nawk,不要使用/ bin / awk或/ usr / bin / awk,因为它们都是旧的,破坏的awk。