2011-06-17 2 views
1

J'ai un fichier txt de 500 lignes et une colonne.trouver un motif dans un fichier

La colonne de chaque ligne apparaît ce que certains comme celui-ci (comme un exemple, je suis coller deux lignes):

chr22:49367820-49368570_NR_021492_LOC100144603,chr22:49368010-49368760_NM_005198_CHKB,chr22:49368010-49368760_NM_152247_CPT1B,chr22:49368010-49368760_NM_152253_CHKB  

chr22:49367820-49368570_NR_021492_LOC100144603,chr22:49368010-49368760_NM_005198_CHKB 

Voulez-vous que je veux extraire de chaque ligne est les valeurs à partir de NM_ ou NR_ comme

  • rangée 1 a NR_021492 NM_005198 NM_152247 NM_152253
  • rangée 2 a NR_021492 NM_005198
  • ...

dans l'onglet Fichier délimité

des suggestions pour une ligne de commande bash?

+0

délimité par onglet, mais une colonne? –

+0

Salut John! Il peut être dans une colonne mais séparé par un tiret (-). Idéalement, j'aimerais les avoir dans différentes colonnes. – Angelo

+0

Est-il correct que la partie 'chr22' soit toujours statique? – Sorpigal

Répondre

2

Essayez:

sed -r -e 's/chr[0-9]+:[^_]*_(N[RM])_([0-9]+)_[^,_]+([, ]|$)/\1_\2'$'\t''/g;s/'$'\t''$//g' 

GNU sed En supposant.

Alors

sed -r -e 's/chr[0-9]+:[^_]*_(N[RM])_([0-9]+)_[^,_]+([, ]|$)/\1_\2'$'\t''/g;s/'$'\t''$//g' your_file > tab_delimited_file 

EDIT: Mise à jour de ne pas laisser un caractère de tabulation de fin sur chaque ligne.

EDIT 2: Mis à jour à nouveau pour fonctionner avec n'importe quelle séquence chr-then-number.

+0

hey votre réponse a presque résolu le problème.Mais pas complètement, voici un exemple de jeu de données pour vous ROW1 chr1: 6684303-6685053_NM_018198_DNAJC11 – Angelo

+0

@Angelo: J'ai demandé si 'chr22' était statique. Je vais mettre à jour ma réponse. – Sorpigal

+1

@Sorpigal, 'sed -r 's/[^ _] * _ (N [RM] _ [0-9] +) _ [^, _] + ([,] | $)/\ 1 \ t/g 'infile' –

2
grep "NM" yourfiname | cut -d_ -f3 | sed 's/[/\d]*/NM_/' 
grep "NR" yourfiname | cut -d_ -f3 | sed 's/[/\d]*/NR_/' 
+1

Cela échoue en supposant qu'un seul NR ou MR sur bloc dans chaque ligne. Les données d'entrée peuvent seulement avoir une "colonne" mais la sortie devrait avoir plusieurs. – Sorpigal

1
cat file|sed s/$.*!(NR)//; 

Utilisez une expression régulière pour enlever tout avant la NR

1
awk -F '[,:_-]' '{ 
    for (i=1; i<NF; i++) 
     if ($i == "NR" || $i == "NM") 
      printf("%s_%s ", $i, $(i+1)) 
    print "" 
}' 

Cela permettra également de travailler, mais imprimer chaque match sur sa propre ligne: egrep -o 'N[RM]_[0-9]+

Questions connexes