2016-12-10 5 views
3

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

Peptidyl-prolyl cis-trans isomerase A OS=Homo sapiens GN=PPIA PE=1 SV=2 - [PPIA] 0.8622399654 3.2730004556 

Я не могу понять, как удалить часть строки до квадратной скобки, так что конечный результат выглядит следующим образом:

[PPIA] 0.8622399654 3.2730004556 

до сих пор я пытался питон re.sub, но не могу соответствовать его к началу строки.

ответ

5

С СЭДОМ это простая замена:

sed 's/^[^[]*\[/[/' input 

^ означает начало шаблона ("линия"), и [^[] соответствует всем, кроме [. * - квантификатор, который означает ноль или более раз. \[ - буква [.

+0

Я не уверен, что «простой» подходит * wink *, но указывает на объяснение шаблона и на то, чтобы быть первым из sed-решений. – thebjorn

+0

Я просто комментировал пользователя 29 + K, рассказывающего пользователю 43 pt, что что-то просто после создания более чем нескольких изменений ... ;-) – thebjorn

1

что-то вроде:

line = line[line.index('['):] 

, если все строки содержат [.

немного более надежный:

for line in open('myfilename..'): 
    if '[' in line: 
     print line[line.index('['):] 
    else: 
     print line 
1

Piping в СЭД:

sed 's/[^[]*[[]/[/' 

клипы все и только линии containig по крайней мере [

2

Простой sed решение, предполагая, что есть максимум один [ в каждой строке:

sed 's/.*\[/[/' file 
  • Создание единственного-[ предположение позволяет получить менее «шумным» регулярное выражение, которое легче понять:

    • s является функцией строка подстановки СЕПГ, чьи аргументы разделяются с обычным (но по выбору) / ограничителем здесь.
    • 1-ый аргумент, регулярное выражение .*\[, соответствует началу любой строки через последний[ на этой линии (дословный [ должен быть представлен в виде \[, потому что [ имеет особое значение в регулярном выражении).
    • Второй аргумент, [, является заменой строки ([) не необходимо экранировать в аргументе с заменой строки, поскольку это не является регулярным выражением).
  • Поскольку sed регулярные выражения всегда жадные, .*\[ соответствует все до последней [ на каждой строке.

  • В противоположность этому, регулярное выражение в andlrc's helpful answer является более сложным, но он соответствует предсказуемо только до первого[ (если таковые имеются).


perl предлагает лучшее из обоих миров в этом случае: надежный вверх-к-первого [ -Только решение, которое до сих пор достаточно читаемым:

perl -pe 's/.*?\[/[/' file 

Записка *? квантификатор, который делает соответствие не-жадным.

+0

Все решения Sed выше обеспечивают желаемый результат, многие +++ для подробных объяснений от кодов – Bio21

+0

@ Bio21: оценено; к сожалению, единственный способ охватить всех людей, которых вы хотите поблагодарить, - это прокомментировать их ответы индивидуально. – mklement0

2

Python решение (с помощью функции bytearray.find(sub[, start[, end]])):

line = 'Peptidyl-prolyl cis-trans isomerase A OS=Homo sapiens GN=PPIA PE=1 SV=2 - [PPIA] 0.8622399654 3.2730004556' 
replaced = line[max(line.find('['), 0):] 

print(replaced) 

Выход:

[PPIA] 0.8622399654 3.2730004556 

P.S. Если [ не встречается внутри строки - результатом будет целая начальная строка

2

Не хотите ли вы иметь последние два поля?

awk '{print $(NF-1), $NF}' file 

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

awk -F'] ' '{print $2}' file 

(Обратите внимание, что это также удаляет пробелы после ])

+0

Да, последние два поля важны. На самом деле awk '{print $ (NF-1), $ NF}' не приводил к выходу. – Bio21

4

С СЕПГ:

sed 's/^[^[]*//' file 

Недостатки: Если строка не содержат [, sed выводит пустую строку.

+1

++ для небольшой оптимизации принятого ответа (не уверен, почему ваш ответ был отклонен). – mklement0

+0

Что происходит с строками, которые не содержат '['? – thebjorn

+1

@ thebjorn: они приведут к пустым выходным линиям, что является справедливой точкой в ​​целом, но обратите внимание на предпосылку вопроса: «10000 строк, подобных этому». – mklement0