简体   繁体   English

如何使用 awk 从文件中选择文本,从行号开始直到某个字符串

[英]How to use awk to select text from a file starting from a line number until a certain string

I have this file where I want to read it starting from a certain line number, until a string.我有这个文件,我想从某个行号开始读取它,直到一个字符串。 I already used我已经用过

awk "NR>=$LINE && NR<=$((LINE + 121)) {print}" db_000022_model1.dlg awk "NR>=$LINE && NR<=$((LINE + 121)) {print}" db_000022_model1.dlg

to read from a specific line until and incremented line number, but right now I need to make it stop by itself at a certain string in order to be able to use it on other files.从特定行读取直到并增加行号,但现在我需要让它在某个字符串处自行停止,以便能够在其他文件上使用它。

DOCKED: ENDBRANCH   7  22
DOCKED: TORSDOF 3
DOCKED: TER
DOCKED: ENDMDL

I want it to stop after it reaches我希望它到达后停止

DOCKED: ENDMDL对接: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 

When I try the当我尝试

awk -v line="$((LINE + 14))" "NR>=line; /DOCKED: ENDMDL/{exit}" "$d.dlg" | awk -v line="$((LINE + 14))" "NR>=line; /DOCKED: ENDMDL/{exit}" "$d.dlg" | sed 's/^........//' > "$d.pdbqt" sed 's/^........//' > "$d.pdbqt"

Just like that in the shell terminal, it works.就像在shell终端中一样,它可以工作。 But in the script it outputs an empty file.但是在脚本中它输出一个空文件。

Depending on your requirements for handling DOCKED: ENDMDL occurring before your target line:根据您处理DOCKED: ENDMDL要求,在您的目标行之前发生:

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

or:或者:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM