为简单的 awk 命令写一个 for 循环 (linux)

Write a for loop for simple awk command (linux)

问题: 我试图在一个文件(物种)中找到多个特定行,然后只将每个物种名称后的第 5 行打印到一个新文件中。我可以单独为每个物种做这件事,但我无法循环遍历文档中的 1000 个物种中的每一个。 例如:

awk 'c&&!--c;/species_1$/{c=5}' results.out > speciesnames

我怎样才能使这个命令成为一个循环,以便它执行以下操作(遍历文件中的每个物种):

物种 1,打印第 5 行以记录标题为物种名称的文件

物种 2,打印第 5 行以记录标题为物种名称的文件

物种 n,打印第 5 行以记录标题为物种名称的文件

如有任何帮助,我们将不胜感激。我对循环的经验很少。 谢谢

来自results.out的数据结构示例:

Query= species_1

length=341
Score
bits
Line 5, relevant info
description
description
description
description
description
description
description
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
nucleotides
data
data
data
data
data
data

Query= species_2

length=341

.......

期望输出到文件 speciesnames:

Line 5, relevant info for species 1
Line 5, relevant info for species 2
Line 5, relevant info for species n

可能是这样的:

awk 'c&&!--c;/species_[0-9]+$/{c=5}' file

awk '/species_[0-9]+/{a[NR+5]} {b[NR]=[=11=]} END {for (i in a) print b[i]}' file

这将打印 species 后的所有第 5 行。
awk 输出中 array 的性质是随机的。

新输入后调整代码:

awk 'c&&!--c;/species [0-9]+$/{c=4}' file
Line 5, relevent info

您在 species 和数字之间没有 _,而是一个 space。
您喜欢点击后的第 4 行,而不是第 5


示例数据:

cat file
Query= species 1
length=341
Score
bits
Line 5, relevent info
description
description
description
description
description
description
Query= species 5
length=341
Score
bits
Line 5, relevent info need this
description
description
description
description
description
Query= species 8
length=341
Score
bits
Line 5, relevent info more data
description
description
description
description
description
Query= species 6423
length=341
Score
bits
Line 5, relevent infom, yes here it is
description
description
description
description
description

awk 'c&&!--c {print i " --> " [=14=]} /species [0-9]+$/{c=4;i= FS }' file
species 1 --> Line 5, relevent info
species 5 --> Line 5, relevent info need this
species 8 --> Line 5, relevent info more data
species 6423 --> Line 5, relevent infom, yes here it is

最终解决方案:

awk 'c&&!--c;/species_/{c=5}' file

一种使用 getline 函数的方法

 awk '/^Query *= *species_[0-9]/{print [=10=]":";for(i=1;i<=5;++i){if(getline>0 &&i==5){print}}}' file

开始循环并从匹配 Query *= *species_[0-90]/

的行中获取每 5 行
for(i=1;i<=5;++i)

到达第 5 行后打印

{if(getline>0 &&i==5){print}}}'

具有

的示例文件
Query= species_1

length=341
Score
bits
Line 5, relevant info
description
description
data
data
data
data
data
data

Query= species_2

length=341
Score
bits
Line 5, relevant info
description
description
data
data
data
data
data
data

结果

Query= species_1:
Line 5, relevant info
Query= species_2:
Line 5, relevant info

你能不能做点像

linenr=0
species=unknown
cat results.out | while read -r line; do
   if [[ "${line}" = Query* ]]; then
      linenr=0
      species=$(echo ${line} | cut -d= -f2)
   else
      (( linenr = linenr + 1 ))
      if [ ${linenr} -eq 5 ]; then
         echo ${line} > ${species}.out
      fi
   fi
done