Разбор строк с определенным шаблоном из файла

У меня есть файл, который выглядит примерно так:

[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

Теперь я хотел бы извлечь из файла только те строки, которые начинаются с [numeric]: Это не всегда только первые два, это также могут быть первые 7 или 8 или что-то еще. Как бы я прочитал в этом файле и вывести файл, содержащий только строки с [числовой]:?

2
задан 21 May 2015 в 23:02

4 ответа

Используя 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)

Для сохранения вывода в файле (output.txt):

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

Используя 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)])
0
ответ дан 21 May 2015 в 23:02

perl путь:

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

awk путь:

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

Вывод для обеих команд

[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)
5
ответ дан 21 May 2015 в 23:02

Эта задача отлично подходит для grep, потому что Вы просто проверяете, который строки содержат достойный шаблона и печати строк, которые делают.

способ heemayl отличен. Вот другой, это подобно, но использует синтаксис регулярного выражения Perl (который GNU grep поддержки, с -P), для более короткого и немного более простого шаблона:

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

Это просто печатает вывод, но можно перенаправить его к outfile:

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

В регулярных выражениях Perl, \d соответствия любая единственная цифра, то же как [0-9] или [[:digit:]].


В случае, если Вам интересно, вот a sed путь:

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

Это проверяет каждую строку, чтобы видеть, соответствует ли она ^\[[0-9]+\]:. Если это делает, команда sed p используется для печати строки. -n флаг препятствует тому, чтобы любые строки были распечатаны за исключением предусмотренного явно sed сценарий.

2
ответ дан 21 May 2015 в 23:02

Если не будет никакой возможности [non-numeric] в начале Ваших строк файла, то просто grep -E '^\[' добьется цели, то есть:

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

$
0
ответ дан 22 May 2015 в 09:02
  • 1
    @OSKali Вы маркируете диск или один из разделов? для меня, не давая маркировки работал до сих пор – InitializeSahib 8 August 2016 в 14:01

Другие вопросы по тегам:

Похожие вопросы: