grep匹配字符串加前后字母

时间:2014-06-25 09:41:34

标签: string awk grep

我有两个带字符串的文件,其中fileA中的字符串与fileB中的部分字符串匹配。每个字符串都是唯一的,只有1个匹配项。 我想将fileA中的字符串与fileB中的字符串进行匹配,并在匹配前后打印匹配和10个字符。

也许grep -f会起作用,但我如何获得前后10个字符。

FILEA

     TGAGGTAGTAGTTTGTACAGTT
     ACTGTACAGGCCACTGCCTTGC
     TGAGGTAGTAGTTTGTGCTGTT

FILEB

     CCAGGCTGAGGTAGTAGTTTGTACAGTTTGAGGGTCTATGATACCACCCGGTACAGGAGA
     TAACTGTACAGGCCACTGCCTTGCCAGG

     CTGGCTGAGGTAGTAGTTTGTGCTGTTGGTCGGGTTGTGACATTGCCCGCTGTGGAGATA
     ACTGCGCAAGCTACTGCCTTGCTAG

     GCTTGGGACACATACTTCTTTATATGCCCATATGAACCTGCTAAGCTATGGAATGTAAAG
     AAGTATGTATTTCAGGC

     CTGTAGCAGCACATCATGGTTTACATACTACAGTCAAGATGCGAATCATTATTTGCTGCT
     CTAG

2 个答案:

答案 0 :(得分:1)

您可以在fileA和grep:

上使用while循环
while read line ; do
    grep -o  ".\{0,10\}$line.\{0,10\}" fileB.txt
done < fileA.txt 

此示例假定fileA.txt的内容不包含可能破坏正则表达式的特殊字符。否则你需要逃脱它们:

while read line ; do
    search=$(sed 's/[^[:alnum:]]/\\\0/g' <<< "$line")
    grep -o  ".\{0,10\}$search.\{0,10\}" fileB.txt
done < fileA.txt 

答案 1 :(得分:1)

您可以使用sed预处理模式并通过stdin发送它:

sed 's/^/.{,10}/;s/$/.{,10}/' fileA | grep -oEf - fileB

这里,sed部分产生如下:

.{,10}TGAGGTAGTAGTTTGTACAGTT.{,10}
.{,10}ACTGTACAGGCCACTGCCTTGC.{,10}
.{,10}TGAGGTAGTAGTTTGTGCTGTT.{,10}

我们使用-E选项来扩展正则表达式。 -之后的-Ef表示我们希望使用标准输入作为文件参数(到-f)。