Извлечь субструктуру из текстового файла, используя bash или python - PullRequest
0 голосов
/ 16 марта 2010

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

SET
TAG1
...
...
SET
...
SET
TAG2
...
...
SET
...
...

Я хотел бы извлечь для конкретной TAG (то есть TAG54) ее отдельную "подструктуру", которая будет

SET
TAG54
...
...
SET

Каждая подструктура для данного TAG_i всегда содержит:

первая строка: SET вторая строка: TAG_i (в данном случае TAG54) произвольное количество строк последняя строка: SET

Интересно, как лучше всего это сделать, будь то в bash или python, поэтому для данного TAG можно «извлечь» эту субструктуру.

Спасибо

Ответы [ 5 ]

1 голос
/ 16 марта 2010

Вот подход Python: вы передаете дескриптор открытого файла в качестве первого аргумента, номер тега в качестве второго аргумента и возвращаете в качестве результата список соответствующих строк (включая символы новой строки) или пустую строку, если тег не найден в файле:

def lookfor(f, tagnum):
  tag = 'TAG%s\n' % tagnum
  for line in f:
    if line == tag:
       break
  else: # file finished, tag not found
    return []
  result = ['SET\n', tag]
  for line in f:
    result.append(line)
    if line == 'SET\n':
        break
  return result

Это должно быть достаточно эффективно. Если вам нужны другие формы аргументов и / или результатов, то, конечно, не составит труда настроить их соответствующим образом.

0 голосов
/ 17 марта 2010
$ awk -vRS="SET" '/TAG54/{print RT$0RT}' file
SET
TAG54
...
...
SET

если вы делаете это с помощью сценариев оболочки, передайте переменную оболочки в awk, используя -v. например,

#!/bin/bash
read -r -p "what's your tag? " tag
awk -vRS="SET" -vt="$tag" '$0~tag{print RT$0RT}' file
0 голосов
/ 16 марта 2010

простак:

BEGIN {
  state=0
}

state==0 && $0=="TAG54" {
  print "SET"
  state=1
}

state==1 {
  print
}

state==1 && $0=="SET" {
  exit
}
0 голосов
/ 16 марта 2010
csplit -f tags input.txt '%^TAG54$%-1' '/^SET$/+1' '%.*%' '{*}'
0 голосов
/ 16 марта 2010

Если grep вашей системы поддерживает -P для регулярного выражения perl:

grep -P 'SET\nTAG54\n[.\n]*\nSET' file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...