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
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
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.
Exemple avec sed
$ sed -rn 's/[^,]+,([^,]+),.*/\1/p' results.txt
33
32
34
31
30
35
28
3160
7450
1600
-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
)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]
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