web-dev-qa-db-fra.com

Extraire un nombre dans un fichier texte en utilisant des expressions régulières

Je sauvegarde la sortie de terminal par 2>&1 | tee ./ results.txt dans un fichier .txt qui contient le texte suivant:

executing: ./home/images/image-001-041.png
0,33, /results/image-001-041.png
1.7828,32, /results/image-001-040.png
1.86051,34, /results/image-001-042.png
1.90462,31, /results/image-001-039.png
1.90954,30, /results/image-001-038.png
1.91953,35, /results/image-001-043.png
1.92677,28, /results/image-001-036.png
1.92723,3160, /results/image-037-035.png
1.93353,7450, /results/image-086-035.png
1.93375,1600, /results/image-019-044.png

Je dois prendre les deuxièmes numéros (après le premier signe de virgule, c'est-à-dire 33,32,34, ...) et les sauvegarder dans une liste dans Python. Qu'est-ce que la commande bash ou la commande d'expression régulière en python? Merci

5
sc241

Utilisation de cut:

cut -sd',' -f2 < result.txt

de man cut :

-d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter
-s, --only-delimited
          do not print lines not containing delimiters
-f, --fields=LIST
          select only these fields;  also print any line that contains
          no delimiter character, unless the -s option is specified
11
αғsнιη

Vous pourriez utiliser awk

awk -F ',' '{print $2}' results.txt

Définissez une virgule comme séparateur de champ et imprimez la deuxième colonne.

6
stumblebee

Exemple avec sed

$ sed -rn 's/[^,]+,([^,]+),.*/\1/p' results.txt
33
32
34
31
30
35
28
3160
7450
1600

Remarques

  • -n n'imprime rien jusqu'à ce que nous le demandions (supprime les lignes qui ne correspondent pas)
  • -r use ERE (nous n'avons donc pas besoin de barres obliques inverses pour les métacaractères + et ()
  • [^,]+, des non-virgules suivies d'une virgule
  • ([^,]+), enregistrer des non-virgules suivies d'une virgule pour plus tard (nous voulons seulement cette partie)
  • .* n'importe quel nombre de caractères (supprime le reste de la ligne)
  • \1 le motif que nous avons enregistré
  • p affiche les lignes que nous avons modifiées (nécessaire avec -n)
5
Zanna

Puisque vous mentionnez Python:

with open('results.txt') as results:
    ids = [int(line.split(',')[1]) for line in results if ',' in line]
    print(ids)

Il crée une liste d’entiers sous la forme ids et l’affiche:

[33, 32, 34, 31, 30, 35, 28, 3160, 7450, 1600]
3
Eric Duminil

Vous pouvez utiliser Perl, qui est similaire aux solutions awk et sed publiées.

-a permet le fractionnement automatique sur chaque ligne.

-F est utilisé pour spécifier le délimiteur permettant de fractionner chaque ligne. La valeur par défaut est ''. Ensuite, le résultat est stocké dans @F. Par conséquent, $ F [1] nous donne la deuxième colonne.

-l s'assure qu'une nouvelle ligne est ajoutée à chaque ligne.

-e est utilisé pour spécifier la commande à exécuter sur chaque ligne imprimée.

$ Perl -F, -ale 'print $F[1]' results.txt
33
32
34
31
30
35
28
3160
7450
1600

Ce qui précède s’étend au programme ci-dessous:

$ Perl -MO=Deparse -F, -ale 'print $F[1]' results.txt
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = readline ARGV)) {
    chomp $_;
    our @F = split(/,/, $_, 0);
    print $F[1];
}
-e syntax OK
2
Wordzilla