Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux shell中具有多个列的循环_Linux_Shell_Loops_Unix_Awk - Fatal编程技术网

Linux shell中具有多个列的循环

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

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