问题:我试图在一个文件(物种)中找到多个特定的行,然后只将每个物种名称后的第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