使用 awk 在循环中打印变量

使用 awk 在循环中打印变量

我是使用 Bash 脚本的新手。我有一个数据文件:

i    z    r                    
0   -30   3.5                 
0   -29.5 3.4                 
0   -29   3.6                  
...                             
0    29.5 4.2                  
0    30   4.6                 
1   -30   2.8                  
1   -29.5 3.4                    
....
1    30   5.2
2   -30   2.5
2   -29.5 2.6

我正在尝试将数据重新排列到这样的文件中:

i     z     r
0    -30    3.5
1    -30    2.8
2    -30    2.5
...
0    -29.5  3.4
1    -29.5  3.4
2    -29.5  2.6
...

我使用了下面的脚本,但它无法像我希望的那样运行。

awk '{
  for(z=/-30/; z<=30; z+=0.5){
    for(i=0; i<=17489;i++){
      if($1==$i  && $2==$z)
        print $1 $2 $3
    }
  }
}' data.dat >> avg_SD.dat

请帮帮我!非常感谢。

答案1

从示例和脚本看来,原始文件按第一列排序()但您希望它主要按第二列排序()而不是

这可以更容易地实现sort

tail -n +2 data.dat | sort -n -k 2 -k 1 >> avg_SD.dat

它也可能比循环两次并对输入文件中的每一行进行至少一百万次比较要快得多。

解释:

  • tail -n +2 data.dat从第二行开始打印data.dat,从而删除标题。

  • |将左侧命令的输出重定向到右侧命令的输入。

  • sort -n -k 2 -k 1按数字方式对输入进行排序 ( -n),首先按第二个字段 ( -k 2),然后按第一个字段 ( -k 1)

  • >> avg_SD.dat将输出打印为avg_SD.dat保留先前的内容。如果要覆盖先前的内容,请使用单个>而不是>>

如果原始文件中没有标题,则不需要tail,可以data.dat直接将其sort作为参数传递:

sort -n -k 2 -k 1 data.dat >> avg_SD.dat

相关内容