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]:?
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)])
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)
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
.
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)
$