这是一个新的和更进一步的问题: Output the result of each loop in different columns。从linux中的循环中抽取字符串中的特定字符
但是由于这是一个新问题,你不需要看链接中的问题,我会明确地澄清下面的新问题。
money.txt
文件有两列:(名字和金钱)
Mary 13
Lucy 8
Jack 20
range.txt
文件中有三列:(水果,MIN_VALUE和MAX_VALUE)
apple 10 15
banana 7 12
orange 17 22
blueberry 14 22
我的目的是要测试是否有钱money.txt
文件位于range.txt
的min_value和max_value之间。如果是,则在range.txt
中输出(max_value
- money
)fruit
的第012个字符,如果不是,则输出"x"
。
例如,Mary
处于money.txt
13
,13
是apple
的MIN_VALUE和MAX_VALUE内,并且max_value
- money
值为15
- 13
= 2
,所以应该打印出的apple
的第2个字符,即p
。
预期的结果是:(第4列是玛丽,第5栏是露西,6列是杰克)
apple 10 15 p x x
banana 7 12 x a x
orange 17 22 x x r
blueberry 14 22 x x l
随着@ocurran的帮助下,我想:
# load prices by index to maintain read order
awk 'FNR == NR {
money[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 <= money[i] && $3 >= money[i]) {
fruit=$1
fruitcharacter=${fruit:($3-money[i]-1):1}
l = l " " $fruitcharacter
} else {
l = l " x"
}
}
print l
}' money.txt range.txt
结果表明:
awk: line 14: syntax error at or near {
awk: line 16: syntax error at or near else
awk: line 19: syntax error at or near }
似乎fruitcharacter=${fruit:($3-money[i]-1):1}
不能工作。但据我所知,我们可以使用${string: index: length}
来提取字符串的字符,我不知道为什么它不能在这种情况下工作。你能帮我解决这个问题吗?谢谢。
从awk脚本的开头开始计数14行,并得到'fruitcharacter = $ {fruit:($ 3-money [i] -1):1}这句话,这对awk来说是句法无稽之谈,因此语法错误输出消息。你说“据我所知,我们可以使用'$ {string:index:length}'来提取字符串的字符”,但这绝对不是真的(提示:** awk不是shell!**)。阅读Arnold Robbins编写的“有效的Awk编程”第4版。 –
@EdMorton谢谢!我确实混合了一些概念。 – lightsnail