我有一个包含三列(ID号,x,y)的文件
Array
我想使用ID号作为循环,这样就像
一样ifile.txt
1 32.2 21.4
4 33.2 43.5
5 21.3 45.6
12 22.3 32.5
32 21.5 56.3
43 33.4 23.4
44 23.3 22.3
55 22.5 32.4
我做了如下,但这看起来很漫长。
when ID=1, then x=32.2, y=21.4
when ID=4, then x=33.2, y=43.5
and so on
我需要简短并且方便。
答案 0 :(得分:3)
这会读取每一行并对x和y进行计算(你没有说出什么计算,所以我做了一个):
$ awk '{printf "ID=%2s: x+y*y=%7.2f\n",$1,$2+$3*$3;}' ifile.txt
ID= 1: x+y*y= 490.16
ID= 4: x+y*y=1925.45
ID= 5: x+y*y=2100.66
ID=12: x+y*y=1078.55
ID=32: x+y*y=3191.19
ID=43: x+y*y= 580.96
ID=44: x+y*y= 520.59
ID=55: x+y*y=1072.26
换句话说,awk
比shell有更好的数学支持。如果你想进行计算,请在awk中完成所有操作。
答案 1 :(得分:3)
表面上,您可以使用:
while read ID x y
do
case "$ID" in
…
esac
echo "$ID $x $y"
done < ifile.txt
其中case
可能或可能不是一种适当的方法,用于决定读取行所采取的操作。
我在没有read
的情况下使用了-r
,因为如果数据包含受-r
存在或不存在影响的字符(反斜杠),代码将会产生heebie-jeebies 。两者都不会特别可靠。您可以另外判断并使用-r
,从而满足您使用-r
&#34;旅
请注意,对于文件中的每一行,您的代码读取文件的次数为3次。这是一个O(N 2 )算法,其中O(N)算法是合适的。
如果您的计算足够复杂,那么使用比shell更强大的语言可以做得更好。您可以考虑使用awk
或Perl或Python(或许多其他语言)。