嵌套的awk命令?

嵌套的awk命令?,awk,Awk,我有以下两个代码: nut=`awk "/$1/{getline; print}" ids_lengths.txt` 及 但是,上面代码中的$1不应表示ids_length.txt中的列,而应表示neco.txt中的第一列!(类似于我在主代码中使用$6和$4) 如果您能帮助解决这些嵌套AWK,我们将不胜感激:-) 编辑: 我的输入文件(neco.txt)的行如下所示: FZWTUY402JKYFZ 2 100.000 3 11 9 4.500 7 0 0 0

我有以下两个代码:

nut=`awk "/$1/{getline; print}" ids_lengths.txt`

但是,上面代码中的$1不应表示ids_length.txt中的列,而应表示neco.txt中的第一列!(类似于我在主代码中使用$6和$4)

如果您能帮助解决这些嵌套AWK,我们将不胜感激:-)


编辑: 我的输入文件(neco.txt)的行如下所示:

FZWTUY402JKYFZ  2   100.000 3   11  9     4.500 7   0   0   0   .   TG  TGTGTGTGT
>FZWTUY402JKYFZ 
153
>FZWTUY402JXI9S 
42
>FZWTUY402JMZO4 
158
最大的问题是,当使用第一列(例如FZWTUY402JKYFZ)进行搜索时,我想过滤第五列中的数字小于数字的行,这是我从另一个文件(ids_length.txt)获得的。这就是为什么我在草稿脚本中加入“nut”变量:-)

ids_length.txt如下所示:

FZWTUY402JKYFZ  2   100.000 3   11  9     4.500 7   0   0   0   .   TG  TGTGTGTGT
>FZWTUY402JKYFZ 
153
>FZWTUY402JXI9S 
42
>FZWTUY402JMZO4 
158
大约:

awk -v select="$1" '$0 ~ select && FNR == NR { getline; nut = $0; } FNR == NR {next} $4 > 1 $5 < nut && $6 >= 49 && $6 <= 180 && ! /#/ && ! /seq-name/ && $NF ~ /^AC.+CA$/ {count++} END {print count}' neco.txt ids_lengths.txt
大约:

awk -v select="$1" '$0 ~ select && FNR == NR { getline; nut = $0; } FNR == NR {next} $4 > 1 $5 < nut && $6 >= 49 && $6 <= 180 && ! /#/ && ! /seq-name/ && $NF ~ /^AC.+CA$/ {count++} END {print count}' neco.txt ids_lengths.txt

您可以将两个
grep-v
操作和四个连续的
awk
操作组合为一个操作。这为您提供了有用的经济性,而无需完全重写所有内容:

nut=`awk "/$1/{getline; print}" ids_lengths.txt`
grep -E -v '#|seq-name' neco.txt |
grep -E '(\S+\s+){13}\bAC(.)+CA\b' |
awk -vnut="$nut" '$6 >= 49 && $6 <= 180 && $4 > 1 && $5 < nut { print }' |
wc -l
nut=`awk/$1/{getline;print}”ids_length.txt`
grep-E-v'#| seq name'neco.txt|
grep-E'(\S+\S+{13}\bAC(.)+CA\b'|
awk-vnut=“$nut”'$6>=49&&6 1&&5

我不会费心让一个
awk
脚本确定
nut
的值,并进行基于值的过滤。这是可以做到的,但它会使事情变得不必要的复杂化——除非您能够证明整个事情是生产系统性能的瓶颈,在这种情况下,您会更加努力地工作(尽管在这种情况下我可能会使用Perl;它可以在一个命令中完成全部工作).

您可以将两个
grep-v
操作和四个连续的
awk
操作组合为一个操作。这为您提供了有用的经济性,而无需完全重写所有内容:

nut=`awk "/$1/{getline; print}" ids_lengths.txt`
grep -E -v '#|seq-name' neco.txt |
grep -E '(\S+\s+){13}\bAC(.)+CA\b' |
awk -vnut="$nut" '$6 >= 49 && $6 <= 180 && $4 > 1 && $5 < nut { print }' |
wc -l
nut=`awk/$1/{getline;print}”ids_length.txt`
grep-E-v'#| seq name'neco.txt|
grep-E'(\S+\S+{13}\bAC(.)+CA\b'|
awk-vnut=“$nut”'$6>=49&&6 1&&5


我不会费心让一个
awk
脚本确定
nut
的值,并进行基于值的过滤。这是可以做到的,但它会使事情变得不必要的复杂化——除非您能够证明整个事情是生产系统性能的瓶颈,在这种情况下,您会更加努力地工作(尽管在这种情况下我可能会使用Perl;它可以在一个命令中完成全部工作).

几乎可以肯定,没有必要对所有的
grep
s和
awk
s进行管道输送,并尝试嵌套
awk
s。请展示一些输入数据和您想要的输出数据,我们将帮助您简化所有这些。同意丹尼斯·威廉姆森的观点。我很确定,所有的事情都可以用
awk
脚本来完成,而不需要那些管道。谢谢你们,伙计们,我编辑了我的问题。你们需要
$nut
调用
awk
,使用双引号;否则,
awk
$nut
解释为
$0
(因为其变量
nut
为零)。(或者,使用
awk-vnut=$nut'$4
,避免@DennisWilliamson指出的问题。)关键的一点是,shell不会在单引号内展开
$nut
。@JonathanLeffler:在这种情况下,
$4
将需要
\$4
。几乎可以肯定的是,不需要对所有
grep
awk
进行管道传输,并尝试嵌套
awk
s。请展示一些输入数据和您想要的输出数据,我们将帮助您简化所有这些。同意丹尼斯·威廉姆森的观点。我很确定,所有的事情都可以用
awk
脚本来完成,而不需要那些管道。谢谢你们,伙计们,我编辑了我的问题。你们需要
$nut
调用
awk
,使用双引号;否则,
awk
$nut
解释为
$0
(因为其变量
nut
为零)。(或者,使用
awk-vnut=$nut'$4
,避免@DennisWilliamson指出的问题。)关键是shell不会在单引号内展开
$nut
。@JonathanLeffler:在这种情况下,
$4
必须是
\$4
。复杂的正则表达式应该只匹配最后一列,并搜索序列的特定开头和结尾。例如,以AC开头,以CA结尾的。那么,长度($6)应该大于或等于49,小于或等于180,开始($4)应该大于1,结束($5)应该小于“螺母”。@Perlnika:我想我已经解决了这些问题。谢谢。我可能在删除空格时输入了一些错误,我将尝试修复它。awk-v select=“$1””$0~select&&FNR==NR{getline nut=$0;}FNR==NR{next}$4>1$5=49&&6@Perlnika:我的答案中的oneliner版本在
getline
之后有一个分号。您评论中的版本不适用。这就是语法错误的来源。复杂的正则表达式应该只匹配最后一列,并搜索序列的特定开头和结尾。例如,以AC开头,以CA结尾的。那么,长度($6)应该大于或等于49,小于或等于180,开始($4)应该大于1,结束($5)应该小于“螺母”。@Perlnika:我想我已经解决了这些问题。谢谢。我可能在删除空格时输入了一些错误,我将尝试修复它。awk-v select=“$1””$0~select&&FNR==NR{getline nut=$0;}FNR==NR{next}$4>1$5=49&&6@Perlnika:我的答案中的oneliner版本在
getline
之后有一个分号。您评论中的版本不适用。这就是语法错误的来源。非常感谢!我可能用错了你的脚本,但我想我很可能会:~$nut=
awk/$1/{getline;print}“ids_length.txt
;grep-E-v'#seq name'neco.txt | grep-E'(\S+\S+{13}\bAC(.)+CA\b'| awk-vnut=$nut'$6>=49&$61&$5