首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套的awk命令?

嵌套的awk命令?
EN

Stack Overflow用户
提问于 2012-07-19 22:28:10
回答 2查看 8.3K关注 0票数 1

我有两个密码:

代码语言:javascript
复制
nut=`awk "/$1/{getline; print}" ids_lengths.txt`

代码语言:javascript
复制
grep -v '#' neco.txt |
grep -v 'seq-name' |
grep -E '(\S+\s+){13}\bAC(.)+CA\b' |
awk '$6 >= 49 { print }' |
awk '$6 <= 180 { print }' |
awk '$4 > 1 { print }' |
awk '$5 < $nut { print }' |
wc -l

我希望我的剧本在这个地方取代“坚果”:

代码语言:javascript
复制
awk '$4 < $nut { print }'

从这里返回的数字:

代码语言:javascript
复制
nut=`awk "/$1/{getline; print}" ids_lengths.txt`

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

对于如何解决这些嵌套的awk问题,我们将非常感激:)

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

代码语言:javascript
复制
FZWTUY402JKYFZ  2   100.000 3   11  9     4.500 7   0   0   0   .   TG  TGTGTGTGT

最大的问题是,当使用第一列(例如,ids_lengths.txt)进行搜索时,我希望筛选第五列中的行号小于数字,这是从另一个文件( FZWTUY402JKYFZ)获得的。这就是为什么我在我的草稿脚本中添加了"nut“变量:-)

ids_lengths.txt看起来是这样的:

代码语言:javascript
复制
>FZWTUY402JKYFZ 
153
>FZWTUY402JXI9S 
42
>FZWTUY402JMZO4 
158
EN

回答 2

Stack Overflow用户

发布于 2012-07-19 23:00:51

您可以将两个grep -v操作和四个连续的awk操作组合到每个操作中。这在不完全重写所有内容的情况下为您提供了有用的节约:

代码语言:javascript
复制
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

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

票数 4
EN

Stack Overflow用户

发布于 2012-07-19 22:48:42

大约:

代码语言:javascript
复制
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

regex需要调整以适应AWK理解的内容。我看不出regex是如何匹配您提供的示例数据的。解决方案的一部分可能是使用字段计数作为条件之一。也许是NF == 13或者NF >= 13

为了提高可读性,下面是上面列出的多行脚本:

代码语言:javascript
复制
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
}' ids_lengths.txt neco.txt 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11570253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档