Tabs 如何对涉及制表符的行进行grep?

Tabs 如何对涉及制表符的行进行grep?,tabs,grep,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

我在玩“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
我希望grep两个文件中出现的一些行:

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”这样的grep格式? thx

编辑: 我真傻。我应该用双引号……(我第一次用单引号,但没有用…)

后续问题: 基于上述问题,我编写了一个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
似乎它将一行中的所有列拆分,并且无法识别它们。 这次有什么问题? thx

grep语法1-o-1

grep[options]模式[文件…]

这意味着grep模式显示为文件[file…]中的模式

模式txt不能有空格或制表符(除非有引号),因为它将作为grep命令的参数进行计算

cat FC_DEL_50r.bed|grep 4011952 4392064

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

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

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

+1获取问题中提供的所有详细信息。

grep语法1-o-1

grep[options]模式[文件…]

这意味着grep模式显示为文件[file…]中的模式

模式txt不能有空格或制表符(除非有引号),因为它将作为grep命令的参数进行计算

cat FC_DEL_50r.bed|grep 4011952 4392064

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

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

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


+1获取问题中提供的所有详细信息。

错误是由于反勾号引起的。反勾号将
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"
困难在于
\t
awk
解释为转义序列。要从
awk
发出文本
\
,您需要转义它:

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

错误是由于反勾号而发生的。反勾号将
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"
困难在于
\t
awk
解释为转义序列。要从
awk
发出文本
\
,您需要转义它:

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