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

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
ryby007
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 wrz 2006, 18:25
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post 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.
Awatar użytkownika
JSokol
Sędziwy Jeż
Sędziwy Jeż
Posty: 67
Rejestracja: 18 mar 2010, 10:57
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: Unity
Architektura: x86_64
Lokalizacja: Down under
Kontakt:

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

Post 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}
Awatar użytkownika
ryby007
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 wrz 2006, 18:25
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post 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
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

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

Post 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
Awatar użytkownika
ryby007
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 wrz 2006, 18:25
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post autor: ryby007 »

TAK jak napisałeś.
Tylko doszedł nieoczekiwany mankament opisany wcześniej.
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

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

Post autor: Mały 1 »

To wstaw większą część pliku. Plik możesz wkleić tu http://wklej.org/
Awatar użytkownika
ryby007
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 wrz 2006, 18:25
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post 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)
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

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

Post 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?
Awatar użytkownika
ryby007
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 wrz 2006, 18:25
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post autor: ryby007 »

MISTRZU ostatni teraz szczegół to tj. pisałem, na początku i na końcu znak % w osobnych liniach
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

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

Post 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$ 
Awatar użytkownika
ryby007
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 wrz 2006, 18:25
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post 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
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

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

Post 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
Awatar użytkownika
ryby007
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 wrz 2006, 18:25
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post 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
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości