语法循环

  • 本文关键字:循环 语法 awk
  • 更新时间 :
  • 英文 :


请用正确的语法编写这段代码?我想为 a 给出一个值,然后写一个条件 - 如果第一列等于 a,则写下这一行。谢谢

#!/bin/bash
for i in {0..2}; do
awk -v var=$i 'a==0.065+var*0.005 $1 == a { print $0 } test.res > outa="$a"' 

测试.res

   6.500000e-02   1.400000e+02   3.000000e-01   8.195821e+05   6.669776e-01
   6.500000e-02   1.400000e+02   3.500000e-01   7.085306e+05   5.766037e-01
   6.500000e-02   1.400000e+02   4.000000e-01   7.737306e+05   6.296636e-01
   6.500000e-02   1.400000e+02   4.500000e-01   7.929304e+05   6.452884e-01
   7.000000e-02   1.600000e+02   5.000000e-01   1.561877e+06   1.271059e+00
   7.000000e-02   1.600000e+02   5.500000e-01   1.548409e+06   1.260098e+00
   7.000000e-02   1.600000e+02   6.000000e-01   1.644194e+06   1.338048e+00
   7.500000e-02   1.400000e+02   3.000000e-01   6.659456e+05   5.419479e-01
   7.500000e-02   1.400000e+02   3.500000e-01   7.285058e+05   5.928595e-01
   7.500000e-02   1.400000e+02   4.000000e-01   7.265234e+05   5.912463e-01
   7.500000e-02   1.400000e+02   4.500000e-01   2.780260e+06   2.262581e+00
   7.500000e-02   1.400000e+02   5.000000e-01   9.186277e+06   7.475812e+00

期望的输出

outa=0.065
   6.500000e-02   1.400000e+02   3.000000e-01   8.195821e+05   6.669776e-01
   6.500000e-02   1.400000e+02   3.500000e-01   7.085306e+05   5.766037e-01
   6.500000e-02   1.400000e+02   4.000000e-01   7.737306e+05   6.296636e-01
   6.500000e-02   1.400000e+02   4.500000e-01   7.929304e+05   6.452884e-01
outa=0.070
   7.000000e-02   1.600000e+02   5.000000e-01   1.561877e+06   1.271059e+00
   7.000000e-02   1.600000e+02   5.500000e-01   1.548409e+06   1.260098e+00
   7.000000e-02   1.600000e+02   6.000000e-01   1.644194e+06   1.338048e+00
outa=0.075
   7.500000e-02   1.400000e+02   3.000000e-01   6.659456e+05   5.419479e-01
   7.500000e-02   1.400000e+02   3.500000e-01   7.285058e+05   5.928595e-01
   7.500000e-02   1.400000e+02   4.000000e-01   7.265234e+05   5.912463e-01
   7.500000e-02   1.400000e+02   4.500000e-01   2.780260e+06   2.262581e+00
   7.500000e-02   1.400000e+02   5.000000e-01   9.186277e+06   7.475812e+00

==是一个比较,=是一个作业。

$ i=1; awk -v var="$i" 'BEGIN{a=0.065+var*0.005} $1 == a' file
   7.000000e-02   1.600000e+02   5.000000e-01   1.561877e+06   1.271059e+00
   7.000000e-02   1.600000e+02   5.500000e-01   1.548409e+06   1.260098e+00
   7.000000e-02   1.600000e+02   6.000000e-01   1.644194e+06   1.338048e+00

顺便说一句,不要在输出文件名中使用=,因为它会使后续调用 awk 等工具难以区分文件名和变量赋值。

awk 'script' outa=1

正在调用没有文件名的 awk,并且名为 outa 的变量的值为 1。您需要执行以下操作:

awk 'script' ./outa=1

告诉 awk outa=1是文件名。

最后 - 目前还不清楚为什么你使用循环而不仅仅是:

awk '{print > sprintf("outa_%.03f",$1)}' file

或者,如果您有超过 15 个左右的输出文件,并且不使用 Gawk 来处理所有这些打开的文件:

awk '{curr=sprintf("outa_%.03f",$1)} curr!=prev{close(prev); prev=curr} {print > curr}' file

如果你想使用 for 循环中的 i 值,你需要在 awk 中声明变量

awk -v var=$i 'a==0.065+var*0.005 .....

如果您发布 samle 数据以及您希望输出的方式,我想我们可以awk完成所有操作,而无需外部for循环。

最新更新