我在玩'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
答案 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"
难点在于\t
将awk
解释为转义序列。要从\
发出文字awk
,您需要将其转义:
{print $2"\\t"$3}