tcsh error: while loop

tcsh error: while loop

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

我有一个名为 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 [=11=] "\n"}' rama.xvg > all_1.dat

为了避免对所有的残基重复做,我写了下面的代码。

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

end

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

请告诉我这段代码中的错误是什么。我觉得跟嵌套有关

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

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

但我认为最好将您的 while-loop 放入 awk:

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