【问题标题】:grep -f forEXACT patterngrep -f forEXACT 模式
【发布时间】:2012-12-19 17:46:22
【问题描述】:

我想从其他更大的文件(输入)中提取名称列表,具有该名称以及与该名称相关的一些附加信息。我的问题是 grep -f 选项,因为它与输入文件中的确切条目不匹配,但其他一些包含相似名称的条目。

我试过了:

$ grep -f list.txt -A 1 input >output

以下是文件的格式;

list.txt

TE_final_35005
TE_final_1040

输入文件

>TE_final_10401
ACGTACGTACGTACGT
>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT

需要的输出:

>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT

我得到的输出:

>TE_final_10401
ACGTACGTACGTACGT
>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT

虽然TE_final_10401不在list.txt中

如何在列表中使用^

请帮助匹配确切的值或建议其他方法来做到这一点。

【问题讨论】:

  • @Thor 我不确定行之间的空格是否是故意的?
  • @sudo_O:格式看起来很像FASTA,一般不是双倍行距。

标签: sed awk grep


【解决方案1】:

添加全字开关(-w):

grep -w -A1 -f list.txt infile

输出:

>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT

【讨论】:

    【解决方案2】:

    有几件事,首先从文件中删除空白行:

    sed  -i '/^\s*$/d' file list
    

    然后-w 用于仅匹配整个单词,-A1 将打印匹配后的下一行:

    $ grep -w -A1 -f list file > new_file
    
    $ cat new_file
    >TE_final_35005
    ACGTACGATCAGT
    >TE_final_1040
    ACGTACGTACGT
    

    【讨论】:

      【解决方案3】:

      正如其他人所提到的,添加 -w 标志是基于您的示例数据的最简洁和最简单的方法。但既然你明确询问了如何在list.txt 中使用^,这里有另一个选项。

      ^ 和/或$ 锚点添加到list.txt 中的每一行:

      $ cat list.txt
      ^>TE_final_35005[ ]*$
      ^>TE_final_1040[ ]*$
      

      这会在行首搜索您的模式,前面有一个> 字符,并忽略任何尾随空格。那么您之前的命令将起作用(假设您删除那些空行或将您的参数更改为-A 2)。

      如果您想将这些锚点自动添加到列表文件中(并同时删除任何空白行),请使用此 awk 构造:

      awk '{if($0 != ""){print "^>"$0"[ ]*$"}}' list.txt >newlist.txt
      

      或者如果您更喜欢 sed 就地编辑:

      sed -i '/^[ ]*$/d;s/\(.*\)/^>\1[ ]*$/g' list.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-17
        • 2019-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多