2011-10-26 1 views
1

J'ai rencontré un problème en jouant avec 'grep'; et probablement à propos de la greffe d'un onglet. J'ai deux fichiers illustrés ci-dessous, tous deux délimités par des tabulations.Comment puis-je grep des lignes impliquant des onglets?

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 

j'espère grep quelques lignes qui apparaissent dans les deux fichiers:

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

Cependant, il y a erreur:

grep: 4392064: No such file or directory 

J'ai essayé cat FM_DEL_50r.bed |head -2|tail -1|awk '{print $2"\t"$3}', cela fonctionne réellement et sorties 4011952 4392064

Donc, peut-être que nous ne pouvons pas grep le format comme «numéro» \ t "numéro"? thx

éditer: comment je suis stupide. Je devrais utiliser des guillemets doubles .......... (j'ai utilisé une seule citation et ne fonctionne pas ...)

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

des questions de suivi: J'ai écrit un script bash , sur la base des questions ci-dessus:

#!/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 

Cependant, il produit

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 

on peut dire qu'elle divise toutes les colonnes d'une ligne et ne peut pas les reconnaître. Quel est le problème cette fois? thx

Répondre

1

syntaxe grep 1-o-1

grep [options] PATTERN [FILE...]

Cela signifie grep motif montré que dans MOTIF dans le fichier [fichier ...]

le motif txt ne peut pas avoir des espaces ou tabulations (sauf si citées) car il sera ensuite évalué en tant qu'argument de commande grep. Donc, dans votre cas, la commande devient effectivement

cat FC_DEL_50r.bed |grep 4011952 4392064

La deuxième partie (Après la conduite) demande essentiellement à grep 4011952 (motif) en 4.392.064 (qui doit être un fichier)

Pour résoudre ce problème , ajouter des guillemets doubles autour de votre seconde expression:

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

+1 pour tous les détails présentés dans la question.

+0

thax .......... cela fonctionne ... – user815408

0

L'erreur se produit en raison des backhalks. Les retours arrière renvoient la sortie awk dans la liste des arguments grep. vous faites de manière efficace:

cat FC_DEL_50r.bed |grep 4011952 4392064 

grep, bien sûr, prend 4011952 être une expression régulière et 4392064 être un nom de fichier, et ne peut pas trouver ce dernier.

Avec les guillemets doubles que vous avez maintenant ajouté dans la liste des arguments, vous obtenez:

cat FC_DEL_50r.bed |grep "4011952 4392064" 

Si ce que vous espériez était:

cat FC_DEL_50r.bed |grep "4011952\t4392064" 

la difficulté est que \t est étant interprété par awk comme une séquence d'échappement. Pour émettre un \ littéral de awk, vous devrez échapper:

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

mais semble "\\ t" et "\ t" les deux travaillent pour moi ..... je suis confus ... thx ... – user815408

Questions connexes