2012-12-03 10 views
5

Czasami pracuję z plikami tekstowymi, w których niektóre sekcje mają wiele akapitów o tej samej strukturze. Oto przykład:Prosty sposób analizowania i wysyłania zapytań wieloliniowych częściowo ustrukturowanych treści

Some unrelated preface I'm not interested in... Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. Etiam scelerisque. 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Etiam scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam scelerisque. 

001 [SomeTitle 1] - Some Subtitle 1 
    Name: SomeName 
    Area: SomeArea 
    Content: Some multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. Etiam scelerisque. Lorem ipsum dolor sit amet, 
      consectetur adipiscing elit. Etiam scelerisque. 

002 [SomeTitle 2] - Some Subtitle 2 
    Name: SomeOtherName 
    Area: SomeOtherArea 
    Content: Some other multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. 

szukam łatwy sposób kwerendy plików, takich jak ten. Na przykład, jeśli zapytam go o "Obszar: SomeOtherArea", wynikiem powinny być wszystkie bloki pliku z tym obszarem. Mam na myśli wszystkie cztery akapity: nagłówek, imię, obszar, treść. Mogę użyć grep z opcją -A i -B, ale problem polega na tym, że akapity treści mogą składać się z dowolnej liczby linii. I to jest właśnie ten konkretny przykład; struktura może być zupełnie inna.

Szukam lekkiego, łatwego do dostosowania rozwiązania, być może kombinacji narzędzi CLI. Nie chcę wymyślać koła.

+0

przewiń mysz nad każdym z tagów przypisanych do pytania. Niektórzy mają zero wyznawców. Lepiej zmienić znaczniki tak, aby zawierały przynajmniej docelowy system operacyjny (Unix/vs/Linux/vs/Windows/vs/Cygwin/...?) I narzędzia, które Ci odpowiadają, powłoka? bash/ksh i dodaj swoje narzędzia wyszukiwania grep, ?? inni. Powodzenia. – shellter

Odpowiedz

2

Przykro mi to mówić, ale tylko z takim problemem możesz sobie poradzić, ponieważ wydaje się, że chcesz mieć szwajcarski scyzoryk z nieskończenie rozszerzalnym zestawem funkcji, ale bez bólu z twojej strony do programowania:)! Takie rzeczy są umiarkowanie możliwe, ale biorąc pod uwagę twoją szeroko otwartą specyfikację, pamiętaj, że ludzie spędzają lata na budowaniu takich wyszukiwarek jak Lucene, Google i tysiące innych, aby rozwiązać ten problem.

To powiedziawszy, jeśli możesz być zadowolony z narzędzia wyszukiwania, które ma bardzo prostą regułę, której należy przestrzegać, ORAZ używasz lub masz dostęp do systemu Unix/Linux/Cygwin, poniższe mogą działać.

Podstawowa zasada: bloki danych będą przeszukiwane w oparciu o pusty znak, jak oddzielający każdy blok (jak w przykładowych danych powyżej).

cat paraSearch.ksh 

#!/bin/ksh 
# (or #!/bin/bash or likely others) 

case $# in 0) echo "usage:paraSearch.ksh SearchTargetPattern file2search [file2 ....]" ; exit 1 ;;esac 

# read the first pattern as the search target, 
# use quotes on cmd-line if you want to use 
# regexp chars like '*' 
mySrchPat="$1" ; shift 

#dbg set -vx 
awk -v mySrchPattern="$mySrchPat" \ 
    'BEGIN{RS=""; ORS="\n\n"} 
    #dbg {print "$0="$0; print "----------------------------------------------" } 
    $0 ~ mySrchPattern{ print $0} 
' "${@}" 

chmod 755 paraSearch.ksh 

badanie przy użyciu próbki tekstu searchTarget a wyjście

$ ./paraSearch.ksh SomeName multiLineTest.txt 
001 [SomeTitle 1] - Some Subtitle 1 
    Name: SomeName 
    Area: SomeArea 
    Content: Some multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. Etiam scelerisque. Lorem ipsum dolor sit amet, 
      consectetur adipiscing elit. Etiam scelerisque. 

Aby dowiedzieć się więcej o awk, przeczytać (kilka razy) to doskonały poradnik: The Grymoire's Awk Tutorial.

IHTH

Powiązane problemy