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



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

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

我如何将这个命令制作成一个循环,以便它执行以下操作(迭代文件中的每个物种):

物种1,在标题为物种名称的文件上打印第5行

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

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

如有任何帮助,我们将不胜感激。我对循环几乎没有经验。感谢

结果的数据结构示例。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

所需输出到文件名:

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]=$0} END {for (i in a) print b[i]}' file

这将在命中species之后打印所有第5行
Do对CCD_ 3在CCD_ 4输出中的性质进行随机化。

新输入后调整代码:

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

species和数字之间没有_,只有一个空格
你喜欢命中后的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 " --> " $0} /species [0-9]+$/{c=4;i=$2 FS $3}' 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 $0":";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

最新更新