Linux shell中具有多个列的循环
我有一个包含三列(ID号、x、y)的文件 我想使用ID号作为一个循环,所以这将读像Linux shell中具有多个列的循环,linux,shell,loops,unix,awk,Linux,Shell,Loops,Unix,Awk,我有一个包含三列(ID号、x、y)的文件 我想使用ID号作为一个循环,所以这将读像 when ID=1, then x=32.2, y=21.4 when ID=4, then x=33.2, y=43.5 and so on 我做了如下工作,但这似乎是一个漫长的过程 id1=1 #ID number id2=$(wc -l < ifile.txt) #total number of IDs while [ $id1 -le $id2 ] do ID=$(awk 'NR=='$i
when ID=1, then x=32.2, y=21.4
when ID=4, then x=33.2, y=43.5
and so on
我做了如下工作,但这似乎是一个漫长的过程
id1=1 #ID number
id2=$(wc -l < ifile.txt) #total number of IDs
while [ $id1 -le $id2 ]
do
ID=$(awk 'NR=='$id1' {print $1}' ifile.txt)
x=$(awk 'NR=='$id1' {print $2}' ifile.txt)
y=$(awk 'NR=='$id1' {print $3}' ifile.txt)
#
#here I want to do some computation using ID, x and y
#e.g. with each ID, I will execute a program by changing its corresponding x and y values
#for instance
echo $ID $x $y
(( id1++ ))
done
id1=1#ID号
id2=$(wc-l
我需要把它缩短并用一种方便的方法。这会读取每一行并对x和y进行计算(你没有说什么计算,所以我编了一个):
换句话说,
awk
比shell有更好的数学支持。如果您想进行计算,请在awk中进行所有计算。这会读取每行并对x和y进行计算(您没有说明计算内容,所以我编了一个):
换句话说,
awk
比shell有更好的数学支持。如果您想进行计算,请在awk中进行。表面上,您可以使用:
while read ID x y
do
case "$ID" in
…
esac
echo "$ID $x $y"
done < ifile.txt
读取ID x y时
做
中的大小写“$ID”
…
以撒
回显“$ID$x$y”
完成
其中,案例
可能是,也可能不是,决定读取行时采取何种操作的合适方法
我使用了不带-r
的read
,因为如果数据包含的字符(反斜杠)会受到-r
的存在或不存在的影响,那么代码将有heebie jeebies。两者都不是特别可靠的。您可以做出其他判断并使用-r
,从而满足“您应该使用-r
”旅的要求
请注意,这将读取文件一次,其中代码会为文件中的每一行读取文件三次。这是一个O(N2)算法,其中O(N)算法是合适的
如果您的计算足够复杂,您最好使用比shell更强大的语言。您可以考虑<代码> AWK<代码>或Perl或Python(或许多其他语言)代替。 < P>表面上,您可以使用:
while read ID x y
do
case "$ID" in
…
esac
echo "$ID $x $y"
done < ifile.txt
读取ID x y时
做
中的大小写“$ID”
…
以撒
回显“$ID$x$y”
完成
其中,案例
可能是,也可能不是,决定读取行时采取何种操作的合适方法
我使用了不带-r
的read
,因为如果数据包含的字符(反斜杠)会受到-r
的存在或不存在的影响,那么代码将有heebie jeebies。两者都不是特别可靠的。您可以做出其他判断并使用-r
,从而满足“您应该使用-r
”旅的要求
请注意,这将读取文件一次,其中代码会为文件中的每一行读取文件三次。这是一个O(N2)算法,其中O(N)算法是合适的
如果您的计算足够复杂,您最好使用比shell更强大的语言。您可以考虑<代码> AWK<代码>或Perl或Python(或许多其他语言)代替。谢谢您的回答。但我需要分别使用ID、x和y值,以便在下一次计算中使用它们。有几个具有这些值的执行。我已经相应地编辑了我的问题。@Kayan为什么你认为你不能用awk进行计算?@Kayan顺便说一下,bash只做整数运算。你输入的数字是浮点数。我的脚本运行良好。我可以通过在$(cat-ifile.txt)中为id使用类似于
的东西来使它更简短吗;不要使用$(cat-ifile.txt)
…卡扬:不要使用$。如果必须使用shell,请使用@JonathanLeffler答案中的方法,该答案显示了如何使用shell高效地读取文件。(如果您想进行“计算”,仍然存在一个问题,x
和y
是浮点数,shell无法处理浮点数。)谢谢您的回答。但我需要分别使用ID、x和y值,以便在下一次计算中使用它们。有几个具有这些值的执行。我已经相应地编辑了我的问题。@Kayan为什么你认为你不能用awk进行计算?@Kayan顺便说一下,bash只做整数运算。你输入的数字是浮点数。我的脚本运行良好。我可以通过在$(cat-ifile.txt)中为id使用类似于的东西来使它更简短吗;不要使用$(cat-ifile.txt)
…卡扬:不要使用$。如果必须使用shell,请使用@JonathanLeffler答案中的方法,该答案显示了如何使用shell高效地读取文件。(如果您想进行“计算”,仍然存在一个问题,x
和y
是浮点数,shell无法处理浮点数。)
while read ID x y
do
case "$ID" in
…
esac
echo "$ID $x $y"
done < ifile.txt