2

我必须从文件'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”运行良好,那么为什么不是第三个呢?

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

4

2 回答 2

3

无需为此投票,我只是想粘贴一些格式化的代码。

您的程序已经足够大,值得拥有自己的代码文件,可以以文明的方式对其进行格式化并与其他版本进行比较。当我们这样做时,我们可以很容易地看到您在每个输入行的操作中分配 OFS。没有造成任何伤害,但这显然是无意的,因此您损失了1337 分。有了这个固定,我们继续前进。

您无法区分单线并学到任何东西。在格式良好的代码上运行 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"
  }
}
于 2013-03-20T14:45:22.343 回答
1

我的钱是你在“.csv”文件行的末尾有 control-Ms,导致显示行的第一部分被隐藏。

为您带来 Windows Vista 等的人免费为您带来这种腐败。

在“.csv”文件上运行“dos2unix”,然后重试。

如果这不起作用,请运行“where awk”和“awk --version”并告诉我们结果。在 Solaris 上,您必须使用 /usr/xpg4/bin/awk 或 nawk,不要使用 /bin/awk 或 /usr/bin/awk,因为它们都是旧的、损坏的 awk。

于 2013-03-20T18:15:22.483 回答