Ich versuche, die Anzahl der Zahlen und Buchstaben in meiner Datei in Bash zu zählen. Ich weiß, dass ich wc -c file
verwenden kann, um die Anzahl der Zeichen zu zählen, aber wie kann ich es nur in Buchstaben und zweitens Zahlen beheben?Wie man die Anzahl der Zahlen/Buchstaben in der Datei zählt?
Antwort
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
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
Terminal zeigt falsche Ausgabe vom ersten und zweiten Beispiel, hmm? –
Dies zählt alle Zeichen für * jede Zeile mit mindestens * einem alphabetischen oder numerischen Zeichen. – Jens
Mache es 'grep -o', um" gemischte Linie 111 "zu kreuzen. –
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
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.
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
'cat myfile.txr | tr -cd [123456789] | wc -c das ist das richtige Beispiel? –
Nutzlose Verwendung von Cat. Und schlägt fehl, wenn eine Datei mit dem Namen "m" vorhanden ist. – Jens
@ K.Dote 0-9 nicht 1-9 –