Strona 1 z 1

BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 24 cze 2014, 21:03
autor: ryby007
Witam.
W ostatnim czasie szukam rozwiązania na problem by wyszukać z pliku txt odpowiedni text i zapisać do osobnego pliku tj. poniżej:

Kod: Zaznacz cały

O00001(aaa)
isdufij
iudsiojuois
ihoiwe
hdoiuhoi
ohoir

O00002(bbb)
jdfjoi
ijosdjf
ijodf
ljoidf

O00003
ljndfhjisljf
ijd
jdfoivj
lfj
Wzór to O_i_5cyfr i muszę utworzyć np. plik o nazwie O00001(aaa) zaś sam tekst w pliku to O00001(aaa) i reszta tekstu poniżej aż do następnego odpowiednika wzoru np. O00002
Umiem jedynie wyszukać wzór i zapisać go jako plik i zapisać pierwszą linijkę tj. nazwa pliku. Jednak jak zapisać resztę tekstu to nie wiem jak no chyba że jeszcze w sed by trzeba było coś napisać.
Proszę o pomoc.

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 10:58
autor: JSokol
Gdybyś wrzucił kod który udało Ci się napisać do tej pory to zapewne więcej osób zachęciłbyś do przyjścia z pomocą.

Ja wymyśliłem coś takiego. Przetestowałem na Twoim przykładzie i działa ok.

Kod: Zaznacz cały

#!/bin/bash

if [ "$#" -ne 1 ]; then
	echo "Podaj nazwe pliku jako parametr"
	exit
fi

READFROM=$1
FILENAME='/dev/null'

while read READLINE; do    

	TESTIF=`echo ${READLINE} | grep  -Ex 'O[0-9]{5}.*'`

	if [[ ${READLINE} == ${TESTIF} ]]; then
		FILENAME=${TESTIF}	
	fi

	echo ${READLINE} >> ${FILENAME}

done < ${READFROM}

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 18:21
autor: ryby007
po twoim kodzie widzę że źle jednak myślałem że wiem jak:)
jednak w twoim już prawie działa tylko w linii 19 wywala niejednoznaczne przekierowanie ${FILENAME} ale na pewno jesteś bliżej niż ja :-x

-- 25 cze 2014 16:51 --

znalazłem co jest nie tak
bo w linijce O00001(aaa) występują też spacje i dlatego np. O00001 (a a a) i wtedy nie tworzy pliku :evil:

-- 25 cze 2014 17:31 --

no i slash / ,tylko w tym problem że gdyby usunąć z całego tekstu / to byłoby źle bo muszę usunąć tylko z tej linijki co jest O00001(aa aa/aa)

-- 25 cze 2014 17:33 --

tekst ma 60.000 linijek więc ręcznie odpada

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 20:38
autor: Mały 1
Ja mam pytanie. Jak mają nazywać się te pliki? Może tak?

Pierwszy plik to O00001(aaa) z zawartością:

Kod: Zaznacz cały

isdufij
iudsiojuois
ihoiwe
hdoiuhoi
ohoir
Drugi plik to O00002(bbb) z zawartością:

Kod: Zaznacz cały

jdfjoi
ijosdjf
ijodf
ljoidf
Trzeci plik to O00003 z zawartością:

Kod: Zaznacz cały

ljndfhjisljf
ijd
jdfoivj
lfj

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 21:12
autor: ryby007
TAK jak napisałeś.
Tylko doszedł nieoczekiwany mankament opisany wcześniej.

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 21:28
autor: Mały 1
To wstaw większą część pliku. Plik możesz wkleić tu http://wklej.org/

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 21:38
autor: ryby007
http://wklej.org/id/1401919/
Można by usunąć najpierw z surowego pliku wszystkie slash i spacje między nawiasami występujące ()
Jak to się uda to tylko pozostanie dodanie w każdym pliku na początku i na końcu w osobnej linijce znak procenta %

-- 25 cze 2014 19:44 --

tylko że w zawartości pliku też znajduje się nazwa pliku w pierwszej linijce np. O00001(aaa)

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 22:07
autor: Mały 1
Na początek z poniższych nazw należy usunąć "/" i "_"

Kod: Zaznacz cały

pic@pic:~/Desktop/cel$ gawk '/O[0-9]{5}/' a
O00001 (odjazd x/y/z)
O00001 (049-479514) 
O00002 (1321-437-001) 
O00003 
O00004 (FR NA DL) 
O00005 (BM41-500-13283.0) 
O00006 
O00007 (BM41-350-13069.0) 
O00008 (KAT SKRECENIA OSI Y) 
O00009 
O00010 (ALU 46X106X300) 
pic@pic:~/Desktop/cel$ 
Po tym zabiegu otrzymasz

Kod: Zaznacz cały

pic@pic:~/Desktop/cel$ gawk '/O[0-9]{5}/{gsub(/\/| /,_); print}' a 
O00001(odjazdxyz)
O00001(049-479514)
O00002(1321-437-001)
O00003
O00004(FRNADL)
O00005(BM41-500-13283.0)
O00006
O00007(BM41-350-13069.0)
O00008(KATSKRECENIAOSIY)
O00009
O00010(ALU46X106X300)
pic@pic:~/Desktop/cel$ 
Nowy plik utworzysz poleceniem

Kod: Zaznacz cały

gawk '/O[0-9]{5}/{gsub(/\/| /,_)}'1 stary_plik > nowy_plik
EDIT:
Czy w pierwszym wierszu każdego pliku musi być również umieszczona jego nazwa?

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 22:30
autor: ryby007
MISTRZU ostatni teraz szczegół to tj. pisałem, na początku i na końcu znak % w osobnych liniach

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 22:50
autor: Mały 1
Aby dodać "%" w pierwszym i ostatnim wierszu

Kod: Zaznacz cały

awk 'NR==1{print "%"}END{print "%"}'1 stary_plik > nowy_plik
Przykład

Kod: Zaznacz cały

pic@pic:~/Desktop$ cat ala 
jeden
dwa
trzypic@pic:~/Desktop$ awk 'NR==1{print "%"} END{print "%"}'1 ala
%
jeden
dwa
trzy
%
pic@pic:~/Desktop$ 

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 23:02
autor: ryby007
tylko żeby tego dokonać dla 500 plików na raz ?

-- 25 cze 2014 21:10 --

no i żeby nie tworzyć kolejnych plików

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 25 cze 2014, 23:23
autor: Mały 1
Można to zrobić dla dowolnej ilości plików, ale każdy plik należy wczytać oddzielnie w pętli.

EDIT:

Jeżeli Twoje pliki mają rozszerzenie ".txt" to aby dodać do pierwszej i ostatniej linii "%" można w danym katalogu wydać polecenie

Kod: Zaznacz cały

for i in *.txt; do awk 'NR==1{print "%" }END{print "%"}'1 "$i" > tmp && mv tmp "$i"; done

Re: BASH/awk jak wyszukać wzór tekstu i skopiować tekst pod nim do pliku.

: 26 cze 2014, 18:42
autor: ryby007
Wszystko działa tylko musiałem powpisywać w puste wiersze średniki ; bo nie chciało kopiować całego tekstu od np. O00001 do O00002.
Nie chciałem usuwać wierszy bo plik stałby się mniej czytelny.

Kod: Zaznacz cały

sed 's/^$/;/g' ALL1 > ALL2
Z podziękowaniem piwo jestem winien wielkie :clap:. Jakbyś był w Mogilnie to pisz maila na pewno otrzymasz