Problem
Wie kann ich die Vorkommen jeder Zeilenlänge zählen, wenn ich eine lange Datei mit vielen Zeilen unterschiedlicher Länge habe?
Beispiel:
file.txt
this
is
a
sample
file
with
several
lines
of
varying
length
Laufen count_line_lengths file.txt
würde geben:
Length Occurences
1 1
2 2
4 3
5 1
6 2
7 2
Ideen?
bash
shell
command-line
scripting
Pete Hamilton
quelle
quelle
length=1
für welches Wort? Sie sollten das Wort auch speichern.Antworten:
count.awk:
{ print length($0); }
...
quelle
awk '{print length}' input.txt | sort | uniq -c
uniq
drinnenawk
. Ich nehme an, die Sortierung kann auch in erfolgengawk
. Ich bevorzuge die reinebash
Lösung.1 9575 1 999
. Um die Zahlen richtig zu sortierensort -g
, verwenden Sie das Originalawk '{print length}' input.txt | sort -g | uniq -c
sort
Befehls durchLC_ALL=C sort
hätte den Vorteil, dass die Zeichen auch richtig sortiert und schneller sind.Pure awk
awk '{++a[length()]} END{for (i in a) print i, a[i]}' file.txt 4 3 5 1 6 2 7 2 1 1 2 2
quelle
Verwenden von
bash
Arrays:#!/bin/bash while read line; do ((histogram[${#line}]++)) done < file.txt echo "Length Occurrence" for length in "${!histogram[@]}"; do printf "%-6s %s\n" "${length}" "${histogram[$length]}" done
Beispiellauf:
quelle
awk
gewinnt es je nach Anwendungsfall ;-) Habe es gerade gepostet, weil das OP speziell nach etwas gefragt hat, das keine andere externe Sprache beinhaltet, was auch bedeutetawk
(so habe ich es gelesen). Auf der anderen Seite ist es nicht einmal mehr so lange, wenn man bedenktwhile read l;do((h[${#l}]++));done<file.txt;for l in "${!h[@]}";do echo "$l ${h[$l]}";done
...$ perl -lne '$c{length($_)}++ }{ print qq($_ $c{$_}) for (keys %c);' file.txt
Ausgabe
quelle
perl -lnE '$c{+length}++}{say "$_ $c{$_}" for keys %c'
Sie können dies erreichen, indem Sie nur grundlegende Unix-Dienstprogramme verwenden:
Wie es funktioniert?
quelle
wc -c
zählt die Bytes , nicht die Zeichen. Wenn Sie Multibyte-Zeichen haben, erhalten Sie größere Zahlen. Versuchen Sie es mitecho -n "你好" | wc -c
`echo -n" 你好 "| wc -m`.wc -c
mitwc -m
?Wenn Sie zulassen, dass die Spalten ausgetauscht werden und die Überschriften nicht benötigt werden, ist dies so einfach wie
while read line; do echo -n $line | wc -m; done < file | sort | uniq -c
(ohne fortgeschrittene Tricks mit
sed
oderawk
) wird funktionieren. Die Ausgabe ist:Eine wichtige Sache, die Sie beachten sollten:
wc -c
Zählt die Bytes, nicht die Zeichen, und gibt nicht die richtige Länge für Zeichenfolgen an, die Multibyte-Zeichen enthalten. Daher die Verwendung vonwc -m
.Verweise:
Mann uniq (1)
Mannsorte (1)
Mann wc (1)
quelle