【问题标题】:How to make a loop with multiple columns in shell?如何在 shell 中创建一个包含多列的循环?
【发布时间】:2016-04-25 03:14:04
【问题描述】:

我有一个包含三列(ID 号、x、y)的文件

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

我想在第 2 列和第 3 列上循环,这样读起来就像

for x=32.2 and y=21.4; do execute a fortran program
for x=33.2 and y=43.5; do execute the same program
and so on

虽然我的以下脚本正在运行,但我需要它以一种有效的方式。

s1=1   #serial number
s2=$(wc -l < ifile.txt)   #total number to be loop
while [ $s1 -le $s2 ]
do
x=$(awk 'NR=='$s1' {print $2}' ifile.txt)
y=$(awk 'NR=='$s1' {print $3}' ifile.txt)
cat << EOF > myprog.f
...
take value of x and y
...
EOF
ifort myprog.f
./a.out
(( s1++ ))
done

请注意:myprog.f 是在 cat 程序中编写的。例如,

cat << EOF > myprog.f
....
....
take value of x and y
....
....
EOF

【问题讨论】:

  • xyz与shell变量$x$y有什么关系,如果xy指的是这些shell变量,那么z指的是什么?
  • 很抱歉给您带来了困惑。不,这里 xy 没有引用这些变量。我已经改变了。谢谢。
  • 所以您希望$x$ymyprog.f 能够读取的环境 变量? $s1 是否相关,还是仅用于驱动循环?
  • 是的,$s1 在这里并不重要。它仅用于驱动循环。
  • 您的更新是否意味着您在循环的每次迭代中(重新)编写 Fortran 程序的源代码,使用ifort 编译它,然后执行它?你为什么不静态地编译一个带有arguments的程序?

标签: linux shell awk


【解决方案1】:

在 bash 中读取文件的简单方法是

while read -r _ x y; do
    echo "x is $x, y is $y"
    # your Fortran code execution
done < ifile.txt
x is 32.2, y is 21.4
x is 33.2, y is 43.5
x is 21.3, y is 45.6
x is 22.3, y is 32.5
x is 21.5, y is 56.3
x is 33.4, y is 23.4
x is 23.3, y is 22.3
x is 22.5, y is 32.4

【讨论】:

    【解决方案2】:

    看起来您试图在每次循环迭代中创建 Fortran 源代码,将循环变量烘焙到源代码中,编译它,然后调用它,效率很低。

    相反,您应该创建一个 Fortan 程序一次,并让它接受参数
    (我不了解 Fortran,而且您没有说明具体的编译器,但也许 this GNU Fortran documentation 会帮助您入门。)

    假设你有这样一个程序并且它的路径是./a.out,你可以调用awk结合xargs如下,传递第二个($2)和第三个($3)字段作为参数:

    awk '{ print $2, $3 }' file | xargs -n 2 ./a.out
    
    • awk '{ print $2, $3 }' 从每个输入行打印第二个和第三个空格分隔的字段,用空格分隔。

    • xargs -n 2awk 的输出中获取一对值,并以每对作为参数调用./a.out。 (这种方法依赖于没有嵌入空格的值,这里就是这种情况。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      相关资源
      最近更新 更多