tcsh错误:while循环

时间:2016-06-15 06:43:15

标签: while-loop csh tcsh

这是一个基本程序,但由于我是新手,我无法找到解决方案。

我有一个名为rama.xvg的文件,格式如下:

-75.635  105.879  ASN-2
-153.704  64.7089  ARG-3
-148.238  -47.6076  GLN-4
-63.2568  -8.05441  LEU-5
-97.8149  -7.34302  GLU-6
-119.276  8.99017  ARG-7
-144.198  -103.917  SER-8
-65.4354  -10.3962  GLY-9
-60.6926  12.424  ARG-10
-159.797  -0.551989  PHE-11
 65.9924  -48.8993  GLY-12
 179.677  -7.93138  GLY-13
..........
...........
-70.5046  38.0408  GLY-146
-155.876  153.746  TRP-147
-132.355  151.023  GLY-148
-66.2679  167.798  ASN-2
-151.342  -33.0647  ARG-3
-146.483  41.3483  GLN-4
..........
..........
-108.566  0.0212432  SER-139
 47.6854  33.6991  MET-140
 47.9466  40.1073  ASP-141
 46.4783  48.5301  SER-142
-139.17  172.486  LYS-143
  58.9514  32.0602  SER-144
  60.744  18.3059  SER-145
-94.0533  165.745  GLY-146
-161.809  177.435  TRP-147
 129.172  -101.736  GLY-148

我需要在一个文件all_1.dat中提取包含“ASN-2”的所有行,依此类推所有147个残基。

如果我在终端中运行以下命令,它会为ASN-2提供所需的输出:

awk '{if( NR%147 == 1 ) printf $0 "\n"}' rama.xvg > all_1.dat

为避免对所有残留重复进行,我写了以下代码。

 #!/bin/tcsh
set i = 1
    while ( $i < 148)
    echo $i
    awk '{if( NR%147 == i ) printf $0 "\n"}' rama.xvg > all_"$i".dat
    @ i++

end

但是此代码在所有输出文件中打印包含GLY-148的行。

请告诉我此代码中的错误是什么。我认为这与嵌套有关。

1 个答案:

答案 0 :(得分:2)

awk行中,变量i是一个awk变量而不是shell变量!如果你想使用shell变量$i,你可以这样做:

awk -v i="$i" '{if( NR%147 == i ) printf $0 "\n"}' rama.xvg > all_"$i".dat

但我认为最好将while - 循环放入awk

awk '{for (i=1; i<=147; i++) { if (NR%147==i) {printf $0 "\n" > ("all_" i ".dat") } } }' rama.xvg