【问题标题】:How to filter a file by n. word in line after pattern?如何按 n 过滤文件。模式后的单词?
【发布时间】:2013-07-29 11:51:40
【问题描述】:

我有一个包含不同行的大文件。

我感兴趣的线条看起来很相似:

lcl|NC_005966.1_gene_59 scaffold441.6   99.74   390 1   0   1   390 34065   34454   0.0  715
lcl|NC_005966.1_gene_59 scaffold2333.4  89.23   390 42  0   1   390 3114    2725    1e-138   488
lcl|NC_005966.1_gene_60 scaffold441.6   100.00  186 0   0   1   186 34528   34713   1e-95    344

现在我想获取模式 'lcl|NC_' 之后的行,但前提是第三个单词(或该行中的第 n 个单词)小于 100。

(在本例中是前两行,因为它们只得到了数字 99.74 和 89.23)

接下来应该将它们保存到一个新文件中。

【问题讨论】:

    标签: command-line sed awk pattern-matching


    【解决方案1】:

    这样就可以了:

    $ awk '$1 ~ /^lcl\|NC_/ && $3<100' file
    lcl|NC_005966.1_gene_59 scaffold441.6   99.74   390 1   0   1   390 34065   34454   0.0  715
    lcl|NC_005966.1_gene_59 scaffold2333.4  89.23   390 42  0   1   390 3114    2725    1e-138   488
    

    它会检查两件事:
    - 以lcl|NC_ 开头的第一个字段:$1 ~ /^lcl\|NC_/ 可以。 (Thanks Ed Morton for improving上一个$1~"^lcl|NC_")
    - 第三个字段 $3<100。

    要保存到文件中,您可以:

    awk '$1 ~ /^lcl\|NC_/ && $3<100' file > new_file
                                          ^^^^^^^^^^
    

    【讨论】:

    • 该方法+1,但您需要转义“|”两次,即$1~"^lcl\\|NC_" 而不是$1~"^lcl|NC_"。如所写,| 表示“或”,因为它是一个 RE 元字符,因此它匹配以 lcl 开头或包含 NC_ 的行,您需要对其进行两次转义或使用 [|],因为它位于字符串文字中,因此被 awk 解析了两次.实际上 - 你应该使用 /../ 而不是 "..": $1~/^lcl\|NC_/ 来明确你正在做一个 RE 比较并稍微简化一下。
    • 非常感谢@EdMorton 的改进!我没有注意到我写的条件不够好。现在我测试了你的代码,它就像一个魅力。刚刚更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2022-07-06
    • 1970-01-01
    • 2021-08-30
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多