awk blues ..怎么了?

时间:2013-03-20 14:26:23

标签: bash awk solaris

我必须从'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”输出中的字母,并添加了一些垃圾信息。

2 个答案:

答案 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。