【问题标题】:find matching patterns in files linux在文件 linux 中查找匹配的模式
【发布时间】:2017-12-14 13:56:36
【问题描述】:

我正在尝试在 2 个文件之间查找匹配的字符串。
例如:
文件 1:

A2M,0.00351888
A2M-AS1,0.00131091
A3GALT2,0.00966505
A4GALT,0.108364
AACS,0.0830823
AACSP1,0.00264056
AADACL2-AS1,0.0318584
AADACL4,0.00384096
AAED1,0.216966

文件 2:

chr1    33772366    33786699    A3GALT2 1   -
chr22   43088126    43116876    A4GALT  1   -
chr12   125549924   125627871   AACS    1   +
chr5    178191863   178203277   AACSP1  1   -
chr1    12704565    12727097    AADACL4 1   +
chr9    99403532    99417599    AAED1   1   -
chr8    117950463   117956239   AARD    1   +
chr7    121713597   121784344   AASS    1   -
chr7    48211056    48687091    ABCA13  1   +
chr1    94458393    94586705    ABCA4   1   -
chr17   66970772    67057136    ABCA9   1   -

我想提取文件 2 中第 4 列等于文件 1 中第一列的行。 我为它写了这个命令:

cat file | cut -d ',' -f1 | grep -wFf - file2 > match_file 

但是当它有另一个字符时 - 不是 [a-z] 像:APCDD1L-AS1。
它只需要 APCDD1L 并给出不正确的结果。 我读到 grep -w 仅适用于“真实”单词,所以我想这就是问题所在。
我该如何解决? (查找整个匹配字符串)

【问题讨论】:

    标签: linux bash file grep


    【解决方案1】:

    使用 awk:

    $ awk 'NR==FNR{a[$1];next}($4 in a)' FS="," file1 FS=" +" file2
    chr1    33772366    33786699    A3GALT2 1   -
    chr22   43088126    43116876    A4GALT  1   -
    chr12   125549924   125627871   AACS    1   +
    chr5    178191863   178203277   AACSP1  1   -
    chr1    12704565    12727097    AADACL4 1   +
    chr9    99403532    99417599    AAED1   1   -
    

    我假设file2 是空格分隔的,FS=" +"。如果实际上是制表符分隔,请设置FS="\t"

    【讨论】:

    • 只需设置FS=" " 而不是FS=" +"FS="\t",无论file2 字段之间有多少空格,它都会起作用。或者在前面设置-v FS='[[:space:]]+|,',它将适用于两个文件。
    【解决方案2】:

    您的数据样本中没有任何内容表明我不能简单地 grep 任何列,因为其中只有一个包含具有该格式的字母数字字符。如果是这样的话,就可以了(与 Bash 兼容):

    #!/bin/bash
    
    rm -f matched_output.txt
    patterns=$( awk -F',' '{ print $1 }' Matching_patterns.txt )
    
    
    while read pattern
    do
        printf "Attempting $pattern"
        grep -F "$pattern" mytext.txt >> matched_output.txt && printf " - Success! \n" || printf " - Failed \n"
    
    done <<< "$patterns"
    

    输入文件

    脚本运行

    输出文件

    希望这对您有用!问候!

    【讨论】:

    • 我以前见过新人在他们的问题中张贴图片,但从未见过有人在答案中张贴图片!用复制/粘贴的文本替换图像,以便阅读本文的人可以复制/粘贴该文本以使用它。
    【解决方案3】:

    你可以试试这个,让你避免名字中特殊符号的困扰

    firsts=( `cat f1 | cut -d',' -f1` ); for lines in ${firsts[@]}; do grep "${lines}" f2 >>output; done
    

    【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多