Bash 如何使用awk从文件中选择从行号开始到特定字符串的文本

Bash 如何使用awk从文件中选择从行号开始到特定字符串的文本,bash,awk,sed,tail,Bash,Awk,Sed,Tail,我有这个文件,我想从一个特定的行号开始,直到一个字符串。我已经用过了 awk“NR>=$LINE&&NR=LINE;/DOCKED:ENDMDL/{exit}”“$d.dlg”| sed的/^……../'>“$d.pdbqt” 就像在shell终端中一样,它可以工作。但在脚本中,它输出一个空文件。取决于处理目标行之前发生的停靠:ENDMDL的要求: awk -v line="$LINE" 'NR>=line; /DOCKED: ENDMDL/{exit}' db_000022_model1

我有这个文件,我想从一个特定的行号开始,直到一个字符串。我已经用过了

awk“NR>=$LINE&&NR=LINE;/DOCKED:ENDMDL/{exit}”“$d.dlg”| sed的/^……../'>“$d.pdbqt”


就像在shell终端中一样,它可以工作。但在脚本中,它输出一个空文件。

取决于处理目标行之前发生的
停靠:ENDMDL
的要求:

awk -v line="$LINE" 'NR>=line; /DOCKED: ENDMDL/{exit}' db_000022_model1.dlg
或:


我没有在这里添加shebang部分,但它在脚本中:DI完成了它。它读取一个排序列表并选择前20个2。它输入20 3中每个项目的特定目录。它读取$d.dlg文件中的一个特定部分,并将其输出到$d.pdbqt中,因此每次迭代都会为文件夹中的每个项目创建$d.pdbqt。我想我已经找到了问题所在。Awk根据整个文件中第一个停靠的:ENDMDL终止,而不是从它开始的行终止。202以上的任何行(第一个停靠的:ENDMDL所在的位置)没有给出任何信息。我给了你两个单独的脚本,并告诉你它们之间的区别是
,这取决于你处理目标行之前发生的DOCKED:ENDMDL的要求。因为你没有在问题中告诉我们在那种情况下你需要什么样的行为。听起来你的要求使用了错误的脚本。我现在觉得自己很愚蠢。。谢谢你,我真的很抱歉打扰你
#!/bin/bash

# This script is for extracting the pdb files from a sorted    list of scored
# ligands

mkdir top_poses

for d in $(head -20 summary_2.0.sort | cut -d, -f1 | cut -d/ -f1)
    do
    cd "$d"||continue
    # find the cluster with the highest population within the dlg
    RUN=$(grep '###*' "$d.dlg" | sort -k10 -r | head -1 | cut -d\| -f3 | sed 's/ //g')
    LINE=$(grep -ni "BEGINNING GENETIC ALGORITHM DOCKING $RUN of 100" "$d.dlg" | cut -d: -f1)
    echo "$LINE"
    # extract the best pose and correct the format
    awk -v line="$((LINE + 14))" "NR>=line; /DOCKED: ENDMDL/{exit}" "$d.dlg" | sed 's/^........//' > "$d.pdbqt"

    # convert the pdbqt file into pdb
    #obabel -ipdbqt $d.pdbqt -opdb -O../top_poses/$d.pdb
    cd ..
    done 
awk -v line="$LINE" 'NR>=line; /DOCKED: ENDMDL/{exit}' db_000022_model1.dlg
awk -v line="$LINE" 'NR>=line{print; if (/DOCKED: ENDMDL/) exit}' db_000022_model1.dlg