如何grep涉及标签的行?

时间:2011-10-26 19:20:04

标签: tabs grep

我在玩'grep'时遇到了一些问题;可能还有关于选项卡的问题。 我有两个文件如下所示,两个文件都是制表符分隔的。

FM_DEL_50r.bed
chr1    3392391 3658426 DEL chr1    3392364 3658425 DEL
chr1    4011952 4392064 DEL chr1    4011953 4392062 DEL
chr1    4468526 4665322 DEL chr1    4468523 4665322 DEL

FC_DEL_50r.bed
chr1    2612264 2613324 DEL chr1    2612205 2613007 DEL
chr1    3392391 3658426 DEL chr1    3392391 3658426 DEL
chr1    4011952 4392064 DEL chr1    4011953 4392060 DEL

我希望看到两个文件中出现的一些行:

cat FC_DEL_50r.bed |grep `cat FM_DEL_50r.bed |head -2|tail -1|awk '{print $2"\t"$3}'`

但是有错误:

grep: 4392064: No such file or directory

我尝试cat FM_DEL_50r.bed |head -2|tail -1|awk '{print $2"\t"$3}',它实际上有效并输出4011952 4392064

所以也许我们不能格式化像'number'\ t“number”? THX

编辑: 我多么愚蠢。我应该使用双引号..........(我首先使用单引号并且不起作用......)

cat FC_DEL_50r.bed |grep "`cat FM_DEL_50r.bed |head -2|tail -1|awk '{print $2"\t"$3}'`"

后续问题: 我根据上面的问题编写了一个bash脚本:

#!/bin/bash
for((c=1;c<=542;c++))
do
    LINE=`head -$c FM_DEL_50r.bed|tail -1`
        P1=`cat $LINE|awk '{print $1"\\t"$2"\\t"$3}'`
        GREP1=`cat FC_DEL_50r.bed |grep "$P1"`
        X1=`cat $GREP1 |awk '{print $5"\\t"$6"\\t"$7}'`

        P2=`cat $LINE|awk '{print $5"\\t"$6"\\t"$7}'`
        GREP2=`cat MC_DEL_50r.bed |grep "$P2"`
        X2=`cat $GREP2 |awk '{print $5"\\t"$6"\\t"$7}'`

        if [ $X1 -eq $X2 ]
        then 
           echo "$LINE"\t"$X1"
        fi
done

然而它会产生

cat: chr1: No such file or directory
cat: 27122653: No such file or directory
cat: 27446984: No such file or directory
cat: DEL: No such file or directory
cat: chr1: No such file or directory
cat: 27880115: No such file or directory
cat: 28225069: No such file or directory
cat: DEL: No such file or directory

似乎它会拆分一行的所有列而无法识别它们。 这次有什么问题? THX

2 个答案:

答案 0 :(得分:1)

grep语法1-o-1

grep [options] PATTERN [FILE...]

这意味着grep模式显示为文件[FILE ...]

中的PATTERN

模式txt不能有空格或制表符(除非引用),因为它将被评估为grep命令的参数。因此,在您的情况下,命令实际上变为

cat FC_DEL_50r.bed |grep 4011952 4392064

第二部分(管道之后)基本上要求在4392064中grep 4011952(模式)(这需要是一个文件)

要解决此问题,请在第二个表达式周围添加双引号:

cat FC_DEL_50r.bed |grep " cat FM_DEL_50r.bed | head -2 | tail -1 | awk'{print $ 2“\ t”$ 3}'"

对于问题中提供的所有详细信息,

+1。

答案 1 :(得分:0)

由于反引号而发生错误。反引号将awk输出拼接到grep参数列表中。你有效地做了:

cat FC_DEL_50r.bed |grep 4011952 4392064
当然,

grep需要4011952为正则表达式,4392064为文件名,无法找到后者。

使用现在在参数列表中添加的双引号,您将获得:

cat FC_DEL_50r.bed |grep "4011952 4392064"

如果您希望的是:

cat FC_DEL_50r.bed |grep "4011952\t4392064"

难点在于\tawk解释为转义序列。要从\发出文字awk,您需要将其转义:

{print $2"\\t"$3}