Extrai um número em um arquivo txt usando expressões regulares

5

Estou salvando a saída do terminal por 2>&1 | tee ./ results.txt em um arquivo .txt que possui o seguinte texto:

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

Eu preciso pegar os segundos números (após o primeiro sinal de vírgula, ou seja, 33,32,34, ...) e salvá-lo em uma lista em Python . O que é o comando bash ou o comando de expressão regular em python? Obrigado

    
por sc241 08.04.2018 / 09:37

5 respostas

11

Usando 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
    
por devWeek 08.04.2018 / 10:16
6

Você poderia usar o awk

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

Defina uma vírgula como o separador de campo e imprima a segunda coluna.

    
por stumblebee 08.04.2018 / 10:19
5

Exemplo com sed

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

Notas

  • -n não imprime nada até que solicitemos (remove linhas não correspondentes)
  • -r usa ERE (portanto, não precisamos de barras invertidas para + e ( ) metacaracteres)
  • [^,]+, algumas não-vírgulas seguidas por uma vírgula
  • ([^,]+), salva algumas não-vírgulas seguidas por uma vírgula para mais tarde (só queremos essa parte)
  • .* qualquer número de caracteres (se livra do resto da linha)
  • do padrão que salvamos
  • p imprime as linhas que alteramos (necessárias com -n )
por Zanna 08.04.2018 / 10:12
3

Desde que você mencionou o Python:

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

Cria uma lista de inteiros como ids e exibe:

[33, 32, 34, 31, 30, 35, 28, 3160, 7450, 1600]
    
por Eric Duminil 08.04.2018 / 13:51
2

Você pode usar o Perl, que é semelhante às soluções awk e sed postadas.

-a ativa a divisão automática em cada linha.

-F é usado para especificar o delimitador para dividir cada linha. O padrão é ''. Então o resultado é armazenado em @F. Assim, $ F [1] nos dá a segunda coluna.

-l garante que uma nova linha seja adicionada a cada linha.

-e é usado para especificar o comando que precisamos executar em cada linha que é impressa

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

O texto acima se expande para o programa abaixo:

$ 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
    
por Wordzilla 09.04.2018 / 12:41