Bash script με καταμέτρηση χαρακτήρων

Γενικά θέματα για τις γλώσσες προγραμματισμού που δεν καλύπτονται από τις άλλες περιοχές της κατηγορίας.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Bash script με καταμέτρηση χαρακτήρων

Δημοσίευση από Christianago » 10 Αύγ 2010 00:34

Δεν ξερω αν το εβαλα στο σωστο μερος οποτε οι mods ας το μεταφερουν στην καταλληλη ενοτητα.
Λοιπον εχω φτιάξει ενα σκριπτακι για να καταμετρω ποσες φορες εμφανιζεται ενας χαρακτήρας μέσα σε ένα οποιοδηποτε αρχείο κειμένου που δίνει ο χρήστης ως όρισμα.
Το προβλημα μου ειναι το εξης. Εχω καταφερει να μετραω ολους τους χαρακτηρες ASCII που βρισκονται στο αρχειο κειμενου,
ενω αυτο που θελω ειναι να μετραει μονο τους λατινικους χαρακτηρες, χωρίς δηλαδη τα κενα, /, $ κλπ.
Υποψιαζομαι οτι γινεται με την tr αλλα πώς.
Επισης θα ηταν πιο ωραιο να εμφανιζα σε ποσοστο επι τοις εκατο την εμφανιση καθε χαρακτηρα. Πως μπορω να παρω το μηκος του πινακα μεσα στο μπλοκ που δουλευω κι ετσι να εφαρμοσω τον τυπο;
Δωστε μου τα φωτα σας.

Κώδικας: Επιλογή όλων

echo -e "Give a file to check: \c "

read tx # εδώ αποθηκευεται το ονομα του αρχειου

awk '&#123; for &#40; i=1; i<=length; i++ &#41; arr&#91;substr&#40;$0, i, 1&#41;&#93;++ &#125;
&#123; for &#40; i in arr &#41; &#123; print i, arr&#91;i&#93; &#125; &#125;' $tx


Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Bash script με καταμέτρηση χαρακτήρων

Δημοσίευση από agrippas » 10 Αύγ 2010 09:43

Το approach σου είναι λάθος.

1. Ένα σωστό Unix πρόγραμμα δεν πρέπει να είναι γραμμένο σε στιλ gw-basic (input $a). Πρέπει το filename να δίνεται ως argument στην $1.

2. Η εντολή wc είναι φίλη σου:

Κώδικας: Επιλογή όλων

&#40;aris@rohala&#58;~&#41;$ wc file.txt 
  5  14 135 file.txt
Πρώτο νούμερο: Γραμμές. Δεύτερο νούμερο: Λέξεις. Τρίτο νούμερο και σημαντικότερο: Χαρακτήρες.

3. Η πίπα που δίνει τον αριθμό των χαρακτήρων μόνο χωρίς κενά, σύμβολα και νούμερα είναι:

Κώδικας: Επιλογή όλων

cat file.txt | tr -d '\n'|sed 's/&#91;^a-zA-Z&#93;//g' | wc | awk '&#123;print $3&#125;'
Η tr κόβει τις γραμμές (\n), η sed σβήνει ό,τι δεν είναι a-z και A-Z, η wc μετράει και η awk εκτυπώνει το τρίτο αποτέλεσμα της wc που είναι ο αριθμός των χαρακτήρων.

4. Τώρα αν κάνεις κάτι παρόμοιο ΠΡΙΝ αλλοιώσεις το αρχείο και πάρεις τον αριθμό όλων των χαρακτήρων, με ένα πίπωμα στην bc (calculator) θα πάρεις το ποσοστό που θες. Το calculator δουλεύει έτσι:

Κώδικας: Επιλογή όλων

echo 10-4|bc
(γυρίζει αποτέλεσμα 6)

Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Bash script με καταμέτρηση χαρακτήρων

Δημοσίευση από agrippas » 10 Αύγ 2010 20:46

Πλήρες πρόγραμμα (βαριόμουνα και είπα να σου το φτιάξω ΚΑΤ' ΕΞΑΙΡΕΣΗ)

Κώδικας: Επιλογή όλων

#! /bin/bash

if test -z "$1"; then 
  echo "USAGE&#58; $0 FILENAME";
  exit 1
fi

filename=$1
totalchars=$&#40;wc $filename | awk &#123;'print $3'&#125;&#41;;
latinchars=$&#40;   tr -d '\n' < $filename  | \
                sed 's/&#91;^a-zA-Z&#93;//g'    | \
                wc                      | \
                awk '&#123;print $3&#125;'&#41;
echo Total chars&#58; $totalchars
echo Latin chars&#58; $latinchars
echo -n 'Percentage &#40;%&#41;&#58; '
echo "scale=4; $latinchars / $totalchars * 100" | bc

exit 0

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Bash script με καταμέτρηση χαρακτήρων

Δημοσίευση από dva_dev » 10 Αύγ 2010 21:34

Αν κατάλαβα καλά θέλει το ποσοστό του κάθε χαρακτήρα όχι όλων. Λογικά πρέπει να είναι από κάποια εισαγωγικά μαθήματα στην ασφάλεια (κρυπτανάλυση με βάση τη συχνότητα εμφάνισης χαρακτήρων σε ένα κείμενο).

Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Bash script με καταμέτρηση χαρακτήρων

Δημοσίευση από agrippas » 10 Αύγ 2010 23:59

Ωπ ναι έχεις δίκιο. Στην περίπτωση αυτή κάνεις το ίδιο για κάθε χαρακτήρα - σε μια loop

Κώδικας: Επιλογή όλων

for character in &#123;a..z&#125; &#123;A..Z&#125;
Φιλτράρεις έξω όλους τους άλλους, μετράς με την wc τον αριθμό τους και κάνεις τη διαίρεση όπως στο παράδειγμα.

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Bash script με καταμέτρηση χαρακτήρων

Δημοσίευση από Christianago » 20 Αύγ 2010 13:38

Ευχαριστω για τις απανητσεις. Ηταν χρησιμες. Επιτελους καταφερα να λυσω το προβλημα.

aricos
Δημοσιεύσεις: 2
Εγγραφή: 29 Σεπ 2010 12:09

Bash script με καταμέτρηση χαρακτήρων

Δημοσίευση από aricos » 29 Σεπ 2010 12:31

Καλημέρα είμαι καινούργιος στο forum και newbie στο bash.

σχετικά με την τελευταία απάντηση
Ωπ ναι έχεις δίκιο. Στην περίπτωση αυτή κάνεις το ίδιο για κάθε χαρακτήρα - σε μια loop
κώδικας:
for character in {a..z} {A..Z}

Φιλτράρεις έξω όλους τους άλλους, μετράς με την wc τον αριθμό τους και κάνεις τη διαίρεση όπως στο παράδειγμα.
δεν μπορώ να μετρήσω τον character.
Λίγη βοήθεια?
thnx

aricos
Δημοσιεύσεις: 2
Εγγραφή: 29 Σεπ 2010 12:09

Bash script με καταμέτρηση χαρακτήρων

Δημοσίευση από aricos » 29 Σεπ 2010 17:42

ok!
Το βρήκα!
tnx :D

Απάντηση

Επιστροφή στο “γλώσσες προγραμματισμού - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες