在shell中有多个列的循环

时间:2015-09-25 02:11:17

标签: linux shell loops unix awk

我有一个包含三列(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

我需要简短并且方便。

2 个答案:

答案 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(或许多其他语言)。