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
-- 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
-- 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ą:
Drugi plik to
O00002(bbb) z zawartością:
Trzeci plik to
O00003 z zawartością:
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.
Z podziękowaniem piwo jestem winien wielkie

. Jakbyś był w Mogilnie to pisz maila na pewno otrzymasz