这是一个基本程序,但由于我是新手,我无法找到解决方案。
我有一个名为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的行。
请告诉我此代码中的错误是什么。我认为这与嵌套有关。
答案 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