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」は正常に実行されます。次に3つ目の「awk」は正常に実行されますか?

main.csvには、1行に15個のカンマ区切りの値があり、12番目の値は次のいずれかになります。

Set 1
Set 2
Set 3
Set 4

PS:Solaris10でbashを使用しています

私はまだ「awk」の問題に取り組んでいます。以下は私が気付いたものです...なぜそれが起こっているのかわかりません(Solaris10とRHEL5の両方でこれが発生しています)

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)を実行すると、出力行のみが変更されたため、両方のプログラムが同等に有効であることがわかります。さまざまな条件下で3回目の実行を行ったに違いありません。おそらく別の入力ファイルですか?

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"ファイル行の終わりにMsがあり、表示された行の最初の部分が非表示になっています。

この破損は、WindowsVistaなどを持ってきた人たちによって追加費用なしであなたにもたらされます。

「.csv」ファイルで「dos2unix」を実行してから、再試行してください。

それでも問題が解決しない場合は、「whereawk」と「awk--version」を実行して結果をお知らせください。Solarisでは、/ usr / xpg4 / bin /awkまたはnawkを使用する必要があります。/bin/awkまたは/usr/ bin / awkはどちらも古く、壊れたawkであるため、使用しないでください。

于 2013-03-20T18:15:22.483 に答える