Как я могу перетянуть строки, включающие вкладки? - PullRequest
1 голос
/ 26 октября 2011

Я столкнулся с некоторой проблемой при игре с '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

Так что, может быть, мы не можем grep форматировать как «число» \ t «число»? 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 ]

1 голос
/ 26 октября 2011

синтаксис grep 1-o-1

grep [options] PATTERN [FILE...]

Это означает, что шаблон grep отображается как в PATTERN в файле [FILE ...]

шаблон txt не может иметь пробелов или табуляций (если не указан в кавычках), так как он будет затем оценен как аргумент команды grep. Так что в вашем случае команда фактически становится

cat FC_DEL_50r.bed |grep 4011952 4392064

Вторая часть (After pipe) в основном просит grep 4011952 (шаблон) в 4392064 (который должен быть файлом)

Чтобы исправить это, добавьте двойные кавычки вокруг вашего второго выражения как:

cat FC_DEL_50r.bed |grep " кошка FM_DEL_50r.bed | голова -2 | хвост -1 | awk '{print $ 2 "\ t" $ 3}' "

+ 1 для всех деталей, представленных в вопросе.

0 голосов
/ 26 октября 2011

Ошибка происходит из-за обратных галочек.Обратные знаки объединяют ваш вывод 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"

, сложность в том,1017 * интерпретируется awk как escape-последовательность.Чтобы испустить буквальное значение \ из awk, вам необходимо его избежать:

{print $2"\\t"$3}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...