Zeichen aus Liste zählen und in Tabelle schreiben

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Petra, 26.08.2006.

  1. Petra

    Petra Jungspund

    Dabei seit:
    26.08.2006
    Beiträge:
    10
    Zustimmungen:
    0
    Hallo,

    ich habe ein (für mich) kniffliges Problem - vorweg: ich möchte keinen fertigen Codeschnipsel sondern ein "Lenken" in die richtige Fahrtrichtung ;)
    wäre das ok?

    Also ... ich bin leider als Einzelkämpferin unterwegs und finde keine Ansprechperson für folgende Aufgabe:

    Ich habe eine *txt-Datei mit Wörtern bzw. den Zeichen, aus welchen die
    Wörter bestehen.
    Ich möchte ein Script bauen, welches die Aufgabe bekommt
    - nimm ein Zeichen (ohne Leerzeichen)
    - kuck wie oft es das Zeichen gibt
    - schreibe das Ergebnis in tabellarischer Form | Zeichen | Anzahl | nieder
    - geh zum nächsten Zeichen
    - schau, ob du dieses Zeichen schon gezählt hast
    - wenn ja - geh weiter
    - wenn nein - kuck wie oft es das Zeichen gibt ...

    - wenn alle Zeichen gezählt und niedergeschrieben sind, hör auf

    Ich habe nun leider noch nicht herausgefunden, wo ich den Faden aufnehmen muss - mit welcher Syntax/welchem Vokabular fange ich an? Ich denke, das ist mein größtes Problem und wäre furchtbar dankbar, für einen Schubs in die richtige Richtung :)

    Viele Grüße,
    Petra
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 phrenicus, 26.08.2006
    phrenicus

    phrenicus Routinier

    Dabei seit:
    24.05.2006
    Beiträge:
    253
    Zustimmungen:
    0
    Ort:
    Tübingen, Germany
    Hallo Petra,

    so ganz spontan fällt mir auch keine einfache Lösung ein. Mit der Shell alleine wird es wahrscheinlich gar nicht gehen.
    Du könntest ein Array abarbeiten, in dem alle zu zählenden Zeichen enthalten sind.
    Du brauchst ferner einen Counter, der sich um eins erhöht, sobald ein Zeichen gefunden wurde.
    Die Ausgabe als Tabelle ist einfach: echo -e "$mychar\t$counter" >> char-tabelle

    Mein Problem, zu dem mir grade nichts einfällt, ist: Wie zählt man die Zeichen in einem Text? Zeilenweise abarbeiten? Könnte so aussehen (Fragment):
    Code:
    while read line;
    do
      echo $line | \
      hier_kommt_der_code_der_die_zeichen_zählt_und_den_counter_erhöht
    done < BLA.txt
    
    Einfach alle Zeichen zu zählen wäre kein Problem. Dafür gibt es wc, das aber nicht zwischen Zeichen unterscheidet, sondern einfach alles zählt.

    Was intelligenteres auf der Shell fällt mir grade nicht ein.

    Gruß
     
  4. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Ich schliesse mich phrenicus an. Mit bash-Mitteln tust Du Dich da schwer. Ich empfehle da eher eher eine höhere Sprache, eventuell Perl oder C.

    Gruss, Xanti
     
  5. #4 root1992, 26.08.2006
    root1992

    root1992 von IT-Lehrern besessen

    Dabei seit:
    02.01.2006
    Beiträge:
    1.138
    Zustimmungen:
    0
    Ort:
    Märchenwald
    Mir würde auch bloß C/C++ einfallen, einen 2D-Array, [Zeichen][vorkommen,bei vorkommen++]
    ich weis nicht, ob so etwas (2D-Array) mti der Shell geht.
     
  6. #5 Wolfgang, 26.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Die Perlvariante als Schnellschuss sähe in etwa so aus:

    Code:
    cat testtextext
    Das ist ein Text mit ein paar Zeichen.
    Hier kommen noch ein paar zeichen.
    Ende.
    
    $ perl -0777 -ne 's/\W+//g;$h{$_}++ for split "",$_;END{print "$_= $h{$_}\n" for keys %h}' testtext
    perl -0777 -ne 's/\W+//g;$h{$_}++ for split "",$_;END{print "$_= $h{$_}\n" for sort keys %h}' testtext
    D= 1
    E= 1
    H= 1
    T= 1
    Z= 1
    a= 5
    c= 3
    d= 1
    e= 11
    h= 3
    i= 8
    k= 1
    m= 3
    n= 8
    o= 2
    p= 2
    r= 3
    s= 2
    t= 3
    x= 1
    z= 1
    
    Du kannst natürlich auch AWK dazu nehmen, was aber lansamer als perl ist.
    Der Trick ist die Verwendung von Hashtables nach entfernen der nicht alphanumerischen Zeichen.
    Sollen Groß und Kleinschreibung nicht berücksichtigt werden, dann wandle erst alles in Kleinbuchstaben um.

    Gruß Wolfgang
     
  7. #6 Petra, 26.08.2006
    Zuletzt bearbeitet: 26.08.2006
    Petra

    Petra Jungspund

    Dabei seit:
    26.08.2006
    Beiträge:
    10
    Zustimmungen:
    0
    Hallo,

    bin gerade erst nach Haus gekommen und sage als erstes mal vielen Dank für eure Antworten!

    @phrenicus
    > Wie zählt man die Zeichen in einem Text?

    Das habe ich bisher recht mühsam "zu Fuß" im Emacs gemacht...
    Code:
    M+x count-matches
    dann Enter und danach das zu zählende Zeichen eingegeben.
    Um mir die Gesamtzahl der Zeichen schnell rauszuschmeißen habe ich
    dann den regexp
    Code:
    .
    eingegeben. Für kleine Absätze ist das ok,
    aber jetzt muss ich größere Textmengen bearbeiten, und dafür ist diese
    Vorgehensweise eine echte Sisyphusarbeit *stöhn

    Dass ich mit der Shell nicht weit komme, habe ich schon befürchtet.

    @Wolfgang
    Dein Tipp kommt der Lösung meines Problems glaube ich am nächsten.
    Einfach alles in Kleinbuchstaben umwandeln kann ich leider nicht, da es sich
    um zwei Listen mit in SAMPA übertragene Wörter handelt - die Listen
    enthalten also sowohl Groß- als auch Kleinbuchstaben sowie numerische
    Zeichen. Ich werde mir deinen "Schnellschuss" morgen früh in Ruhe
    anschauen - auf den ersten Blick kann ich vor allem nichts mit

    Code:
    -0777
    anfangen, aber das werde ich schon noch herausfinden
    ;-) Zudem muss ich innerhalb der beiden Listen zum Teil 2 Zeichen als eines
    Interpretieren (z.B. a: - a und Doppelpunkt gelten also als Einheit) - da
    müsste ich also noch irgendwie eine Variable reinschieben, welche diese Fälle
    berücksichtigt...

    Nun denn - morgen geht's weiter und wenn's läuft werde ich es hier posten.

    Vielen Dank nochmal :)
    Grüße, Petra
     
  8. #7 Wolfgang, 26.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Nur kurz zu meinem Beispiel:
    Die Option -0777 veranlasst perl, die gesamte datei einzulesen (EOF ist oktal 777).
    Siehe auch perldoc perlrun
    Ein a: wird bei meiner Variante einfach zu a gezählt.
    Es werden nur alphanumerische Zeichen gezählt.
    Dein Problem mit Groß und Kleinbuchstaben ist eigentlich keines. Du kannst es auch getrennt betrachten, wie ich es gemacht habe.

    Gruß Wolfgang
     
  9. #8 Petra, 27.08.2006
    Zuletzt bearbeitet: 27.08.2006
    Petra

    Petra Jungspund

    Dabei seit:
    26.08.2006
    Beiträge:
    10
    Zustimmungen:
    0
  10. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Da Wolfgang nicht da ist, antworte ich mal. @ ist kein alphanumer. Zeichen. Das sind [A-Za-z0-9].

    Ich hab Wolfgangs Lösung entsprechend Deiner Anfrage modifiziert:

    Code:
    [~]$ cat testtext
    Das ist ein Text mit ein paar Zeichen.
    Hier kommen noch ein paar zeichen.
    a:@b:
    [~]$ perl -0777 -ne 's/(?<!a):|[^\w\@:]//g; $h{$_}++ for split /(?!:)/,$_; END{print "$_= $h{$_}\n" for sort keys %h}' testtext
    @= 1
    D= 1
    H= 1
    T= 1
    Z= 1
    a= 5
    a:= 1
    b= 1
    c= 3
    e= 10
    h= 3
    i= 8
    k= 1
    m= 3
    n= 7
    o= 2
    p= 2
    r= 3
    s= 2
    t= 3
    x= 1
    z= 1
    
    Gruss, Xanti
     
  11. #10 phrenicus, 28.08.2006
    phrenicus

    phrenicus Routinier

    Dabei seit:
    24.05.2006
    Beiträge:
    253
    Zustimmungen:
    0
    Ort:
    Tübingen, Germany
    Hallo,

    klasse Code. Wird Zeit, mal perl zu lernen ;)
    Allerdings wird bei einem Testtext von mir auch der _ (underscore) mitgezählt. Gilt der als alphanumerisches Zeichen?

    Gruß
     
  12. #11 Xanti, 28.08.2006
    Zuletzt bearbeitet: 28.08.2006
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Stimmt, \w matcht sowohl Alphanumerische Zeichen als auch _. Danke für den Hinweis. Folgender Code müsste richtig sein:

    Code:
    perl -0777 -ne 's/(?<!a):|[^\p{Alnum}\@:]//g; $h{$_}++ for split /(?!:)/,$_; END{print "$_= $h{$_}\n" for sort keys %h}' testtext
    Gruss, Xanti

    edit: Nein, _ ist kein alphanumerisches Zeichen.
     
  13. #12 phrenicus, 28.08.2006
    phrenicus

    phrenicus Routinier

    Dabei seit:
    24.05.2006
    Beiträge:
    253
    Zustimmungen:
    0
    Ort:
    Tübingen, Germany
    Hallo Xanti,

    hier ist interessanterweise das @ dabei:

    Code:
    8        33
    9        89
    @        67
    A        504
    B        677
    
    sowie weitere Zeichen am Ende, die ich so nicht zuordnen kann. Durch cat -A gepiped sieht das dann so aus:

    Code:
    y        396$
    z        1923$
    M-D        17$
    M-V        2$
    M-\        50$
    M-_        124$
    M-d        644$
    M-v        370$
    M-|        747$
    
    Gruß
     
  14. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Das ist richtig, da @ auf Wunsch von Petra gezählt werden soll.

    Hmm, sind vermutlich Steuerzeichen. Diese sollten theoretisch nicht mitgezählt werden. Kannst Du mir bitte einen Teil Deines Textes zum Testen zukommen lassen?

    btw, mein cat kennt keine Option -A. Was bewirkt dies?

    Gruss, Xanti
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 phrenicus, 28.08.2006
    phrenicus

    phrenicus Routinier

    Dabei seit:
    24.05.2006
    Beiträge:
    253
    Zustimmungen:
    0
    Ort:
    Tübingen, Germany
    Hallo,

    Code:
    man cat:
    -A, --show-all
                  equivalent to -vET
    -v, --show-nonprinting
                  use ^ and M- notation, except for LFD and TAB
    -E, --show-ends
                  display $ at end of each line
    -T, --show-tabs
                  display TAB characters as ^I
    
    URL zum Download des Textes per PN.

    Gruß
     
  17. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    @ phrenicus:

    Das sind Umlaute. :)

    Code:
    y= 89
    z= 303
    Ä= 8
    Ö= 2
    Ü= 4
    ß= 8
    ä= 95
    ö= 52
    ü= 130
    
     
Thema:

Zeichen aus Liste zählen und in Tabelle schreiben

Die Seite wird geladen...

Zeichen aus Liste zählen und in Tabelle schreiben - Ähnliche Themen

  1. Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

    Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...: Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und...
  2. Wie kann ich x Zeichen hinter einem bestimmten Wort ausgeben ?

    Wie kann ich x Zeichen hinter einem bestimmten Wort ausgeben ?: In mehreren Dateien ist immer mehrfach ein bestimmtes Wort enthalten, gefolgt von einem "=". Ich möchte mir die dahinter folgenden 10 Zeichen...
  3. Zeichen an Zeilenanfang für bestimmten Zeilenbereich einfügen

    Zeichen an Zeilenanfang für bestimmten Zeilenbereich einfügen: Hallo, ich würde gerne in einem Textdokument, z.B. von Zeile 10 - 18, an den Zeilenanfang ein # einfügen. Habe mir schon diverse Seiten zu SED...
  4. Nicht erkannte Zeichen nach Update

    Nicht erkannte Zeichen nach Update: Hi, nachdem ich mein Kali Linux geupdated habe, ist mir aufgefallen dass viele Zeichen auf verschiedenen Nutzeroberflächen nur fehlerhaft...
  5. Jolla Lebenszeichen: Sailfish OS wird aktualisiert

    Jolla Lebenszeichen: Sailfish OS wird aktualisiert: Der in Finanzprobleme geratene finnische Smartphonehersteller Jolla aktualisiert sein mobile Betriebssystem Sailfish OS 2.0. Das erste...