web-dev-qa-db-fra.com

Analyser les lignes avec un motif spécifique en dehors du fichier

J'ai un fichier qui ressemble à peu près à ceci:

[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)
position:
sites: 5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6 
01010010101010101010101010101011111100011
1111010010010101010101010111101000100000
00000000000000011001100101010010101011111

Maintenant, je voudrais extraire uniquement les lignes qui commencent par [numérique]: du fichier. Ce ne sont pas toujours les deux premiers, il pourrait également s'agir des 7 ou 8 premiers. Comment pourrais-je lire dans ce fichier et sortir un fichier contenant uniquement les lignes avec [numérique]:?

2
user3069326

Utiliser grep:

$ grep "^\[[0-9]\+\]:" file.txt 
[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)

Pour enregistrer la sortie dans un fichier (output.txt):

grep "^\[[0-9]\+\]:" file.txt > output.txt

Utiliser python:

#!/usr/bin/env python2
import re
with open('/path/to/file.txt') as f:
  print '\n'.join([line.rstrip() for line in f if re.search(r'^\[\d+\]:', line)])
9
heemayl

La manière Perl:

Perl -ne 'print "$1\n" if /^(\[[0-9]*\]:.*)/' testdata > out

La manière awk:

awk 'match($0, /^\[[0-9]*\]:/)' testdata > out

Sortie pour les deux commandes

[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)
5
A.B.

Cette tâche convient parfaitement à grep , car vous ne faites que vérifier les lignes contenant une correspondance pour un motif et les imprimer.

façon heemayl est excellent. En voici un autre similaire mais qui utilise syntaxe d'expression régulière Perl (que GNU grep prend en charge, avec -P), pour un motif plus court et légèrement plus simple:

grep -P '\[\d+\]:' infile

Cela ne fait qu'imprimer le résultat, mais vous pouvez le rediriger vers outfile:

grep -P '\[\d+\]:' infile > outfile

Dans les expressions régulières Perl, \d correspond à tout chiffre, comme [0-9] ou [[:digit:]].


Si cela vous intéresse, voici un sed :

sed -nr '/^\[[0-9]+\]:/p' infile
sed -nr '/^\[[0-9]+\]:/p' infile > outfile

Cela vérifie chaque ligne pour voir si elle correspond à ^\[[0-9]+\]:. Si tel est le cas, la commande sed p est utilisée pour imprimer la ligne. L’indicateur -n empêche l’impression de lignes autres que celles prévues explicitement par le script sed.

2
Eliah Kagan

S'il n'y a pas de posibilité d'un [non-numeric] au début de vos lignes de fichier, alors simplement grep -E '^\[' fera l'affaire, à savoir:

$ cat /tmp/tmp.tmp
[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)
position:
sites: 5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6
01010010101010101010101010101011111100011
1111010010010101010101010111101000100000
00000000000000011001100101010010101011111

$ grep -E '^\[' /tmp/tmp.tmp
[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)

$
0
boardrider