bash script για εύρεση λέξης - Solved με Perl τελικά  Το θέμα επιλύθηκε

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

bash script για εύρεση λέξης - Solved με Perl τελικά

Δημοσίευσηαπό SAMSONIC » 24 Φεβ 2013, 17:48

Γρήγορη απορία...

Πως γίνεται να βρούμε μια λέξη μέσα σε ένα αρχείο κειμένου και αφού βρεθεί αυτή η λέξη να τυπωθεί στην οθόνη μια άλλη λέξη που θα βρίσκεται στην ίδια γραμμή ή σε κάποια επόμενη?

π.χ. το κείμενο είναι:

μπλα μπλα μπλα λέξη μπλα μπλα μπλα μπλα μπλα 24/02/2013 μπλα μπλα μπλα

και να τυπώνεται η ημερομηνία.
Τελευταία επεξεργασία από SAMSONIC και 25 Φεβ 2013, 02:01, έχει επεξεργασθεί 2 φορά/ες συνολικά
Γνώσεις => Linux: Χμμμ κάτι κάνω... ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
Λειτουργικό => Ubuntu 12.04 precise 3.2.0-38-generic-pae 32bit (el_GR.UTF-8, Unity ubuntu) ‖ Windows 7
Χαρακτηριστικά => Intel Core2 Duo CPU T5550 1.83GHz ‖ RAM 2004 MiB ‖ Quanta 30CC - HP Pavilion dv6700 Notebook PC
Κάρτα γραφικών => Intel Mobile GM965/GL960
Κάρτες δικτύων => Ethernet: Realtek RTL8101E/RTL8102E ‖ Wireless: Intel PRO/Wireless 3945ABG
SAMSONIC
babeTUX
babeTUX
 
Δημοσιεύσεις: 11
Εγγραφή: 12 Φεβ 2012, 23:08
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό lucinos » 24 Φεβ 2013, 18:00

ένα απλό εργαλείο για αυτές τις δουλειές είναι η grep και ποιο σύνθετο η awk.
επίσης μπορείς να χρησιμοποιήσεις την less και να ψάξεις την λέξη που θες γράφοντάς την μετά από /
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό eliasps » 24 Φεβ 2013, 18:15

Πρέπει να υπάρχει κάποιο μοτίβο, διαφορετικά αν οι λέξεις που ψάχνεις και αυτές που θες να τυπωθούν είναι τυχαία κατανεμημένες και δεν έχουν κοινά στοιχεία στα οποία θα βασιστεί το script, δεν γίνεται να χρησιμοποιηθεί το ίδιο script για να κάνει αυτή τη δουλειά γενικά.
Άβαταρ μέλους
eliasps
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4017
Εγγραφή: 16 Δεκ 2011, 22:25
Τοποθεσία: Αθήνα, Αττική
Launchpad: eliasps
IRC: eliasps
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό SAMSONIC » 24 Φεβ 2013, 21:07

με την grep προσπάθησα αλλά δεν είχα αποτέλεσμα. στην ουσία η αναζήτηση έχει ως εξής:

δίνει μια συγκεκριμένη λέξη ο χρήστης και μόλις βρεθεί η λέξη θα πρέπει να συνεχιστεί η αναζήτηση στο κείμενο μέχρι το επόμενο pattern της μορφής "αριθμός - αριθμός". όταν βρεθεί το pattern αυτό απλά να εμφανίζεται στην οθόνη. το κείμενο είναι έτσι δομημένο που θα υπάρχει σίγουρα αυτό το pattern μετά από την συγκεκριμένη λέξη.

η awk είναι όντως πολύπλοκη... :?
Γνώσεις => Linux: Χμμμ κάτι κάνω... ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
Λειτουργικό => Ubuntu 12.04 precise 3.2.0-38-generic-pae 32bit (el_GR.UTF-8, Unity ubuntu) ‖ Windows 7
Χαρακτηριστικά => Intel Core2 Duo CPU T5550 1.83GHz ‖ RAM 2004 MiB ‖ Quanta 30CC - HP Pavilion dv6700 Notebook PC
Κάρτα γραφικών => Intel Mobile GM965/GL960
Κάρτες δικτύων => Ethernet: Realtek RTL8101E/RTL8102E ‖ Wireless: Intel PRO/Wireless 3945ABG
SAMSONIC
babeTUX
babeTUX
 
Δημοσιεύσεις: 11
Εγγραφή: 12 Φεβ 2012, 23:08
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό lucinos » 24 Φεβ 2013, 22:13

πάντως μπορείς να χρησιμοποιήσεις Perl ή Python και να κάνεις την δουλειά σου.
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό SAMSONIC » 24 Φεβ 2013, 22:23

Σίγουρα υπάρχουν εναλλακτικές απλά επειδή έχει και άλλα τερτίπια (π.χ. τραβάει το αρχείο από site, το σώζει temporaly κ.α.) και τα έχω υλοποιήσει με δύο τρεις εντολές σε Bash, ίσως είναι πιο χρονοβόρο να κοιτάξω με μια γλώσσα προγραμματισμού που δεν γνωρίζω. Με C ίσως να μπορούσα αλλά σε bash ίσως να είναι λιγότερο μπελαλίδικο.... ή ίσως σε C να γίνεται η αναζήτηση μόνο... ε?

καμιά άλλη πρόταση?
Γνώσεις => Linux: Χμμμ κάτι κάνω... ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
Λειτουργικό => Ubuntu 12.04 precise 3.2.0-38-generic-pae 32bit (el_GR.UTF-8, Unity ubuntu) ‖ Windows 7
Χαρακτηριστικά => Intel Core2 Duo CPU T5550 1.83GHz ‖ RAM 2004 MiB ‖ Quanta 30CC - HP Pavilion dv6700 Notebook PC
Κάρτα γραφικών => Intel Mobile GM965/GL960
Κάρτες δικτύων => Ethernet: Realtek RTL8101E/RTL8102E ‖ Wireless: Intel PRO/Wireless 3945ABG
SAMSONIC
babeTUX
babeTUX
 
Δημοσιεύσεις: 11
Εγγραφή: 12 Φεβ 2012, 23:08
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό eliasps » 24 Φεβ 2013, 23:01

Άμα πρόκειται για κάποιου είδους web scraping, γίνεται πιο εύκολα σε python παρά σε C ή Bash (ανάλογα το κείμενο που θες να εξάγεις). Ίσως και με Perl, αλλά δεν γνωρίζω την γλώσσα.
Θες δηλαδή θες αυτό το script να κάνει την ίδια δουλειά σε πολλά κείμενα;
Με αναζήτηση διαφορετικής λέξης στο κάθε ένα και ανάλογα με αυτήν, να τυπώνει τον αμέσως επόμενο αριθμό ή ημερομηνία;
Η με την χρήση της ίδιας λέξης να γίνεται η αναζήτηση;
Άβαταρ μέλους
eliasps
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4017
Εγγραφή: 16 Δεκ 2011, 22:25
Τοποθεσία: Αθήνα, Αττική
Launchpad: eliasps
IRC: eliasps
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό evolgen » 24 Φεβ 2013, 23:26

Δεν κατάλαβα ακριβώς, αλλά μπορώ να σου γράψω σχετικά εύκολα ένα τέτοιο script σε Perl. Το pattern αριθμός - αριθμός θα είναι πάντα ημερομηνία ή κάτι άλλο; Γιατί strictly-speaking, η ημερομηνία δεν είναι "αριθμός-αριθμός", γιατί έχει ανάμεσα το "/".
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό simosx » 24 Φεβ 2013, 23:28

SAMSONIC έγραψε:
Πως γίνεται να βρούμε μια λέξη μέσα σε ένα αρχείο κειμένου και αφού βρεθεί αυτή η λέξη να τυπωθεί στην οθόνη μια άλλη λέξη που θα βρίσκεται στην ίδια γραμμή ή σε κάποια επόμενη?

π.χ. το κείμενο είναι:

μπλα μπλα μπλα λέξη μπλα μπλα μπλα μπλα μπλα 24/02/2013 μπλα μπλα μπλα

και να τυπώνεται η ημερομηνία.


Με Perl

Μορφοποιημένος Κώδικας: Επιλογή όλων
if ( m/λέξη/ ) 
{
if ( m/(\d+)\/(\d+)\/(\d+)/ )
{
print "Βρέθηκε ημερομηνία: $1-$2-$3\n";
}
}
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό evolgen » 24 Φεβ 2013, 23:33

simosx έγραψε:
SAMSONIC έγραψε:
Πως γίνεται να βρούμε μια λέξη μέσα σε ένα αρχείο κειμένου και αφού βρεθεί αυτή η λέξη να τυπωθεί στην οθόνη μια άλλη λέξη που θα βρίσκεται στην ίδια γραμμή ή σε κάποια επόμενη?

π.χ. το κείμενο είναι:

μπλα μπλα μπλα λέξη μπλα μπλα μπλα μπλα μπλα 24/02/2013 μπλα μπλα μπλα

και να τυπώνεται η ημερομηνία.


Με Perl

Μορφοποιημένος Κώδικας: Επιλογή όλων
if ( m/λέξη/ ) 
{
if ( m/(\d+)\/(\d+)\/(\d+)/ )
{
print "Βρέθηκε ημερομηνία: $1-$2-$3\n";
}
}

Το αποπάνω έχει το πρόβλημα ότι μπορεί άλλη ημερομηνία να βρίσκεται πριν από τη λέξη. Θεωρώντας ότι το κείμενο περιέχεται στη μεταβλητή $line, καλύτερο είναι το εξής:

Μορφοποιημένος Κώδικας: Επιλογή όλων
if (
$line =~ /$word # lexi
.*? # otidipote allo anamesa (non-greedy)
(\d{2}\/\d{2}\/\d{4}) # imerominia ws dd/mm / yyyy
/ xs
)
{
print $1 . "\n";
}

Αυτό θα δώσει το πρώτο hit μόνο. Αν θέλεις πολλαπλά hits, τότε ο κώδικας γίνεται:

Μορφοποιημένος Κώδικας: Επιλογή όλων
while ( $line =~ /$word/ )
{
if (
$line =~ /$word # lexi
.*? # otidipote allo anamesa (non-greedy)
(\d{2}\/\d{2}\/\d{4}) # imerominia ws dd/mm/yyyy
/xs
)
{
print $1 . "\n";
$line = $';
}
}

Το αποπάνω θεωρεί ότι όντως ακολουθεί ημερομηνία μετά τη λέξη, αλλιώς θα πέσει σε endless loop. Αν και υπάρχει τρόπος να προβλεφθεί και αυτό...
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Επόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι