2016-09-16 92 views
0

price.txt文件具有兩列:(名稱和值)輸出在不同的列每個循環的結果

Mary 134 
Lucy 56 
Jack 88 

range.txt文件有三列:(水果和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 

其實,我想我的結果是這樣的:(每個名字都有一個列)

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

因爲我需要使用paste添加到輸出文件和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」))來更多地控制輸出。 – 2016-09-16 15:34:32

回答

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

謝謝@ocurran,實際上我需要按「名稱」順序安排專欄(從左到右是瑪麗,露西和傑克)。我突然想到:是否有可能在每行中輸出「1」和「x」作爲字符串?例如:第一行應該是「apple 57 136 1x1」,「1x1」按照Mary,Lucy和Jack的順序排列。 – lightsnail

+0

'長度(陣列)'現在是POSIX的一部分,它不再是特定於gawk的。切勿使用名爲'l'的變量,因爲它看起來太像數字'1',因此模糊了您的代碼。所有awk內置/生成的數組,函數和字符串都從1開始,而不是從0開始,因此,請從1開始手動創建數組,以避免記住數組的後續創建方式。 –

相關問題