2016-05-15 9 views

Antwort

0

Sie können tr verwenden, um nur alphanumerische Zeichen beizubehalten, indem Sie die Flags -c (Komplement) und -d (löschen) kombinieren. Von dort aus ist es nur eine Frage der einige Rohrleitungen:

$ cat myfile.txr | tr -cd [:alnum:] | wc -c 
+0

'cat myfile.txr | tr -cd [123456789] | wc -c das ist das richtige Beispiel? –

+0

Nutzlose Verwendung von Cat. Und schlägt fehl, wenn eine Datei mit dem Namen "m" vorhanden ist. – Jens

+0

@ K.Dote 0-9 nicht 1-9 –

0

Um die Anzahl der Buchstaben und Zahlen rechnen Sie grep mit wc kombinieren:

grep -o [a-z] myfile | wc -c 
grep -o [0-9] myfile | wc -c 

Mit wenig zwicken Sie es ändern können zu zählen, Zahlen oder alphabetische Wörter oder alphanumerische Worte wie diese,

grep -o [a-z]+ myfile | wc -c 
grep -o [0-9]+ myfile | wc -c 
grep -o [[:alnum:]]+ myfile | wc -c 
+0

Terminal zeigt falsche Ausgabe vom ersten und zweiten Beispiel, hmm? –

+0

Dies zählt alle Zeichen für * jede Zeile mit mindestens * einem alphabetischen oder numerischen Zeichen. – Jens

+0

Mache es 'grep -o', um" gemischte Linie 111 "zu kreuzen. –

0

Sie sed verwenden können, um alle Zeichen zu ersetzen, die nicht von der Art sind, dass Sie suchen und zählen dann die Zeichen des Ergebnisses.

# 1h;1!H will place all lines into the buffer that way you can replace 
# newline characters 
sed -n '1h;1!H;${;g;s/[^a-zA-Z]//g;p;}' myfile | wc -c 

It's easy enough to just do numbers as well. 
sed -n '1h;1!H;${;g;s/[^0-9]//g;p;}' myfile | wc -c 

Or why not both. 
sed -n '1h;1!H;${;g;s/[^0-9a-zA-Z]//g;p;}' myfile | wc -c 
0

Es gibt eine Reihe von Möglichkeiten, Analyse der Linie zu nähern, Wort und Zeichen Frequenz einer Textdatei in bash. Unter Verwendung der Bash-Built-Character-Case-Filter (z. B. [:upper:] usw.) können Sie die Häufigkeit jedes Auftretens jedes Zeichentyps in einer Textdatei aufschlüsseln. Unten ist ein einfaches Skript, das von stdin liest und den normalen wc-Ausgang als erste Zeile der Ausgabe bereitstellt, und gibt dann die Nummer upper, lower, digits, punct und whitespace aus.

#!/bin/bash 

declare -i lines=0 
declare -i words=0 
declare -i chars=0 
declare -i upper=0 
declare -i lower=0 
declare -i digit=0 
declare -i punct=0 

oifs="$IFS" 

# Read line with new IFS, preserve whitespace 
while IFS=$'\n' read -r line; do 

    # parse line into words with original IFS 
    IFS=$oifs 
    set -- $line 
    IFS=$'\n' 

    # Add up lines, words, chars, upper, lower, digit 
    lines=$((lines + 1)) 
    words=$((words + $#)) 
    chars=$((chars + ${#line} + 1)) 
    for ((i = 0; i < ${#line}; i++)); do 
     [[ ${line:$((i)):1} =~ [[:upper:]] ]] && ((upper++)) 
     [[ ${line:$((i)):1} =~ [[:lower:]] ]] && ((lower++)) 
     [[ ${line:$((i)):1} =~ [[:digit:]] ]] && ((digit++)) 
     [[ ${line:$((i)):1} =~ [[:punct:]] ]] && ((punct++)) 
    done 
done 

echo " $lines $words $chars $file" 
echo " upper: $upper, lower: $lower, digit: $digit, punct: $punct, \ 
whitespace: $((chars-upper-lower-digit-punct))" 

Testeingang

$ cat dat/captnjackn.txt 
This is a tale 
Of Captain Jack Sparrow 
A Pirate So Brave 
On the Seven Seas. 
(along with 2357 other pirates) 

Beispiel Verwendung/Output

$ bash wcount3.sh <dat/captnjackn.txt 
5 21 108 
upper: 12, lower: 68, digit: 4, punct: 3, whitespace: 21 

Sie das Skript anpassen können Sie so wenig oder so viel Detail geben, wie Sie möchten. Lass es mich wissen, wenn du irgendwelche Fragen hast.

1

Hier ist eine Möglichkeit, Rohre vollständig zu vermeiden, nur tr und die Art und Weise der Schale mit der Länge einer Variablen zu geben, mit ${#variable}:

$ cat file 
123 sdf 
231 (3) 
huh? 564 
242 wr =! 
$ NUMBERS=$(tr -dc '[:digit:]' < file) 
$ LETTERS=$(tr -dc '[:alpha:]' < file) 
$ ALNUM=$(tr -dc '[:alnum:]' < file) 
$ echo ${#NUMBERS} ${#LETTERS} ${#ALNUM} 
13 8 21