Analisar linhas com padrão específico fora do arquivo

2

Eu tenho um arquivo que parece mais ou menos assim:

[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

Agora, gostaria de extrair apenas as linhas que começam com [numérico]: do arquivo. Nem sempre são os dois primeiros, também podem ser os primeiros 7 ou 8 ou o que for. Como eu iria ler neste arquivo e saída de um arquivo contendo apenas as linhas com [numérico]:?

    
por user3069326 08.05.2015 / 22:06

4 respostas

9

Usando 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)

Para salvar a saída em um arquivo ( output.txt ):

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

Usando 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)])
    
por heemayl 08.05.2015 / 22:11
5

A maneira perl :

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

A maneira awk :

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

Saída para ambos os comandos

[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)
    
por A.B. 08.05.2015 / 22:11
2

Esta tarefa é perfeitamente adequada para grep , porque você ' apenas verificando quais linhas contêm uma correspondência para um padrão e imprimindo as linhas que o fazem.

o caminho do heemayl é excelente. Aqui está outra que é semelhante, mas usa sintaxe de expressão regular Perl (que o GNU grep suporta, com -P ), para um padrão mais curto e um pouco mais simples:

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

Isso apenas imprime a saída, mas você pode redirecioná-la para outfile :

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

Em expressões regulares Perl, \d corresponde a um único dígito, igual a [0-9] ou [[:digit:]] .

Caso você esteja interessado, aqui está uma sed maneira :

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

Isso verifica cada linha para ver se corresponde a ^\[[0-9]+\]: . Em caso afirmativo, o comando sed p é usado para imprimir a linha. O -n flag impede que qualquer linha seja impressa, exceto conforme explicitamente fornecido pelo script sed .

    
por Eliah Kagan 09.05.2015 / 04:11
0

Se não houver uma posibilidade de [non-numeric] no início de suas linhas de arquivo, simplesmente grep -E '^\[' fará o truque, a saber:

$ 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)

$
    
por boardrider 09.05.2015 / 21:12