2016-09-16 3 views
0

price.txtファイルには2つの列があります(名前と値)出力異なる列の各ループの結果

Mary 134 
Lucy 56 
Jack 88 

range.txtファイルが3つの列があります(果実及びMIN_VALUEとMAX_VALUE)

apple 57 136 
banana 62 258 
orange 88 99 
blueberry 98 121 

を私の目的はprice.txtファイルの値がrange.txtのmin_valueとmax_valueの間にあるかどうかをテストすることです。はいの場合は1を、そうでない場合は"x"を出力します。

私が試した:

awk 'FNR == NR { name=$1; price[name]=$2; next} { 
    for (name in price) { 
     if ($2<=price[name] && $3>=price[name]) {print 1} else {print "x"} 
    } 
}' price.txt range.txt 
をしかし、私の結果は同じように、すべての列にあり、次のとおりです。

1 
1 
x 
x 
x 
x 
x 
x 
1 
1 
1 
x 

は実際に、私は私の結果は以下のようになりたい。(それぞれの名前は、一つの列を持っています)私は、出力ファイルを追加するためにpasteを使用する必要があるため

1 x 1 
1 x 1 
x x 1 
x x x 

range.txtファイルをまとめてください。最終結果は次のようになります。

apple 57 136 1 x 1 
banana 62 258 1 x 1 
orange 88 99 x x 1 
blueberry 98 121 x x x 

したがって、どのようにして各ループの結果を異なる列に得ることができますか?とにかく私の現在のコードに基づいてpasteせずに最終結果を出力するには?ありがとうございました。

+0

printステートメントは、引数にORS(デフォルトでは改行)を追加します。 printf(たとえば、printf( "1"))を使用して出力をさらに制御できます。 –

答えて

1

これは、あなたが提供するものの上に構築さ

# load prices by index to maintain read order 
FNR == NR { 
    price[names++]=$2 
    next 
} 
# save max index to avoid using non-standard length(array) 
END { 
    names=NR 
} 
{ 
l = $1 " " $2 " " $3 
for (i=0; i < names; i++) { 
    if ($2 <= price[i] && $3 >= price[i]) { 
      l = l " 1" 
    } else { 
      l = l " x" 
    } 
} 
print l 
} 

と出力を発生し、

apple 57 136 1 x 1 
banana 62 258 1 x 1 
orange 88 99 x x 1 
blueberry 98 121 x x x 

ただし、スコア(匿名結果)のための人の名前を持っていない - 多分それは意図的なものです?

ここでの変更は、順序を維持するために最初のブロックに配置された配列を明示的に索引付けすることです。

+0

ありがとう、@コキュラン、実際に私は "名前"の順序(左から右にメアリー、ルーシーとジャックです)に配置される列が必要です。私は突然、アイデアを得ました。 "1"と "x"を各行に文字列として出力する可能性はありますか?たとえば、最初の行は 'apple 57 136 1x1'、' 1x1'はMary、Lucy、Jackの順に並んでいます。 – lightsnail

+0

'length(array)'は現在POSIXの一部であり、もはやgawk固有ではありません。 'l'という名前の変数を決して使用しないでください。数字は' 1'のように非常によく見えますので、コードを難読化します。すべてのawkビルトイン/生成された配列、関数、文字列は0ではなく1で始まるので、手作業で作成した配列も1で開始して、後で配列がどのように作成されたかを覚えておく必要がありません。 –

関連する問題