[BASH] praca z tekstem

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
MCKorgan
Piegowaty Guziec
Piegowaty Guziec
Posty: 3
Rejestracja: 12 lis 2008, 17:18
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: Fluxbox

[BASH] praca z tekstem

Post autor: MCKorgan »

Mam plik txt a w nim znajduje się coś takiego:

440000 Re: Kurs EUR/PLN kigam <pilot.zolwia@gmail.com> Thu, 04 Sep 2008 18:45:00 +0200 <48C0108C.7070505@gmail.com> <65d5356e-0bb4-4e2f-aef2-930527a8643b@r35g2000prm.googlegroups.com> <491a4$48c0065a$20711@news.teranews.com> 1553 13 Xref: news2.icm.edu.pl pl.biznes.wgpw:440000
440001 Re: FUTRA (FW20U8) 2626 "domestos" <gracz100.SKASUJ@gazeta.pl> Thu, 4 Sep 2008 17:10:03 +0000 (UTC) <g9p4pb$n20$1@inews.gazeta.pl> <g9o7n9$gd3$1@inews.gazeta.pl> 859 4 Xref: news2.icm.edu.pl pl.biznes.wgpw:440001

i mam zapisać do innego pliku.txt sam adres email czyli z tego fragmentu będzie to:

pilot.zolwia@gmail.com i gracz100.SKASUJ@gazeta.pl

powinno to się wykonać z wykorzystaniem polecenia sed. Kombinowałem z tym i za bardzo mi to nie wychodzi.
Zapisuje mi to co znajduje się w ostatnim "<>" czyli:

491a4$48c0065a$20711@news.teranews.com i g9o7n9$gd3$1@inews.gazeta.pl

Trzeba jakiś na pewno warunek żeby tylko z pierwszego "<>" pobierało ale za bardzo nie wiem jak. Jeszcze mam jedna prosbe za bardzo nie wiem jak zrobic zeby mi zliczalo ilosc tych samych wyrazow w pliku.txt i zapisywalo to do innego pliku . Byłbym bardzo wdzięczny za pomoc.
dawidgarus
Wytworny Kaczor
Wytworny Kaczor
Posty: 418
Rejestracja: 09 lut 2007, 23:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [BASH] praca z tekstem

Post autor: dawidgarus »

Kod: Zaznacz cały

cat plik.txt | egrep -o "<.+> (Sun|Mon|Tue|Wed|Thu|Fri|Sat)" | egrep -o "<.+>" | tr -d "<>" > wynik.txt
MCKorgan
Piegowaty Guziec
Piegowaty Guziec
Posty: 3
Rejestracja: 12 lis 2008, 17:18
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: Fluxbox

Odp: [BASH] praca z tekstem

Post autor: MCKorgan »

dawidgarus w pliku wynik.txt nic sie nie znajduje, wynik.txt jest pusty ;/ z tego co prowadzacy mowil to sie robi przez sed ale niestety ja na tym zbyt dobrze sie nie znam;/
gril
Sędziwy Jeż
Sędziwy Jeż
Posty: 39
Rejestracja: 09 lis 2008, 00:47
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME

Odp: [BASH] praca z tekstem

Post autor: gril »

Poczytaj sobie o sed i wyrażaniach regularnych.
dawidgarus
Wytworny Kaczor
Wytworny Kaczor
Posty: 418
Rejestracja: 09 lut 2007, 23:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [BASH] praca z tekstem

Post autor: dawidgarus »

niemożliwe. dla przykładu, który podałeś wychodzi prawidłowy wynik:

Kod: Zaznacz cały

~$ cat > plik.txt
440000 Re: Kurs EUR/PLN kigam <pilot.zolwia@gmail.com> Thu, 04 Sep 2008 18:45:00 +0200 <48C0108C.7070505@gmail.com> <65d5356e-0bb4-4e2f-aef2-930527a8643b@r35g2000prm.googlegroups.com> <491a4$48c0065a$20711@news.teranews.com> 1553 13 Xref: news2.icm.edu.pl pl.biznes.wgpw:440000
440001 Re: FUTRA (FW20U 2626 "domestos" <gracz100.SKASUJ@gazeta.pl> Thu, 4 Sep 2008 17:10:03 +0000 (UTC) <g9p4pb$n20$1@inews.gazeta.pl> <g9o7n9$gd3$1@inews.gazeta.pl> 859 4 Xref: news2.icm.edu.pl pl.biznes.wgpw:44000
~$ cat plik.txt | egrep -o "<.+> (Sun|Mon|Tue|Wed|Thu|Fri|Sat)" | egrep -o "<.+>" | tr -d "<>" > wynik.txt
~$ cat wynik.txt 
pilot.zolwia@gmail.com
gracz100.SKASUJ@gazeta.pl
Awatar użytkownika
daris
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 26 lut 2007, 17:20
Płeć: Mężczyzna
Wersja Ubuntu: 15.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Odp: [BASH] praca z tekstem

Post autor: daris »

Kod: Zaznacz cały

cat plik.txt | grep -o "<[a-zA-Z0-9.\$]*@[a-zA-Z0-9.\$]*>" | tr -d "<>"
:craz:
MCKorgan
Piegowaty Guziec
Piegowaty Guziec
Posty: 3
Rejestracja: 12 lis 2008, 17:18
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: Fluxbox

Odp: [BASH] praca z tekstem

Post autor: MCKorgan »

dawidgarus:
sorki dla 2 takich linijek jak ja podalem dziala ale jak mam np. duzo wiecej ich to w wynik.txt nic, niemam moze da sie jakos zeby przy wiekszej ilosci tez dzialalo?

daris:
w twoim wypisuje wszystkie co sa "<>" a tu chodzi tylko o to pierwsze wystapienie

EDIT:
troche sie pobawilem w tym i zrobilem cos takiego i raczej dziala
cat plik.txt | grep -o "<[a-zA-Z0-9.\$]*@[a-zA-Z0-9.\$]*> [A-Z.\$]" | grep -o "<[a-zA-Z0-9.\$]*@[a-zA-Z0-9.\$]*>" | tr -d "<>" | sort > wynik.txt

a teraz sie zastawialem jak teraz napisac zeby w pliku powiedzmy o nazwie ostateczne.txt zostaly tylko pojedyncze wystapienia danego maila i obok ilosc wystapien go w pliku wynik.txt . Tutaj myslalem jakos z while ale za bardzo nie wiem.
jak by panowie dalo sie jeszcze jakis pomysl do tego bylbym wdzieczny
dawidgarus
Wytworny Kaczor
Wytworny Kaczor
Posty: 418
Rejestracja: 09 lut 2007, 23:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [BASH] praca z tekstem

Post autor: dawidgarus »

napisałem skrypt w php (wymagana paczka php5-cli):

Kod: Zaznacz cały

#!/usr/bin/php5
<?php
$handle = fopen("php://stdin", "r");
while(!feof ($handle)) {
 $line = trim(fgets($handle, 4096));
 isset($count[$line]) ? $count[$line]++ : $count[$line]=1;
}
fclose($handle);
foreach ($count as $k => $v) {
 if (!empty($k)) {
  echo $k." ".$v."\n";
 }
}
?>
zapisać skrypt, nadać prawa do wykonywania i:

Kod: Zaznacz cały

./skrypt < wynik.txt > ostateczny.txt
albo bezpośrednio:

Kod: Zaznacz cały

cat plik.txt | grep -o "<[a-zA-Z0-9.\$]*@[a-zA-Z0-9.\$]*> [A-Z.\$]" | grep -o "<[a-zA-Z0-9.\$]*@[a-zA-Z0-9.\$]*>" | tr -d "<>" | sort | ./skrypt > ostateczny.txt
Awatar użytkownika
daris
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 26 lut 2007, 17:20
Płeć: Mężczyzna
Wersja Ubuntu: 15.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Odp: [BASH] praca z tekstem

Post autor: daris »

Kod: Zaznacz cały

#!/bin/bash
plik=`cat plik.txt`
maile=`echo $plik | grep -o "<[a-zA-Z0-9.\$]*@[a-zA-Z0-9.\$]*> [A-Z.\$]" | grep -o "<[a-zA-Z0-9.\$]*@[a-zA-Z0-9.\$]*>" | tr -d "<>" | sort | uniq`
for mail in $maile
do
	zaw+="$mail	`echo $plik | grep -o -e $mail | wc -l`\n"
done
echo -e $zaw | column -t
zapisz to jako jakiś plik i później daj:

Kod: Zaznacz cały

chmod +x nazwa_pliku
./nazwa_pliku
:craz:
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

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