Tabs 如何对涉及制表符的行进行grep?
我在玩“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
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
似乎它将一行中的所有列拆分,并且无法识别它们。
这次有什么问题?
thxgrep语法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}