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