Sto cercando un modo semplice per trovare la lunghezza della linea più lunga in un file. Idealmente, sarebbe un semplice comando bash shell invece di uno script.
Sto cercando un modo semplice per trovare la lunghezza della linea più lunga in un file. Idealmente, sarebbe un semplice comando bash shell invece di uno script.
Risposte:
Usando wc (GNU coreutils) 7.4:
wc -L filename
dà:
101 filename
-L
dipende dalle impostazioni internazionali. Alcuni caratteri (sia nel byte che nel senso multibyte) potrebbero addirittura non essere contati affatto!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
è nella coreutils
formula, che installa tutti i coreutils GNU con un g
prefisso.
awk '{print length, $0}' Input_file |sort -nr|head -1
Per riferimento: ricerca della riga più lunga in un file
END{}
blocco.
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
awk 'length>max{max=length}END{print max}' file
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
Solo per scopi educativi e divertenti, la pura soluzione shell POSIX , senza l'uso inutile di cat e nessun passaggio a comandi esterni. Prende il nome file come primo argomento:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$1"
esso può facilmente leggere da stdin. Con un test per $#
esso potrebbe anche fare entrambe le cose, a seconda del numero di argomenti. Non c'è bisogno di gatti inutili in questo mondo. I neofiti dovrebbero essere insegnati di conseguenza fin dall'inizio.
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Stampa la lunghezza, il numero di riga e il contenuto della riga più lunga
perl -ne 'print length()." line $. $_"' myfile | sort -n
Stampa un elenco ordinato di tutte le righe, con numeri di riga e lunghezze
.
è l'operatore di concatenazione - viene utilizzato qui dopo length ()
$.
è il numero di riga corrente
$_
è la riga corrente
wc -L
è la migliore soluzione che ho visto finora.
wc -L
impiegarono 3 secondi
wc -L
conta solo i record numerici - questa Q stava per trovare la riga più lunga - non è esattamente la stessa, quindi questo non è un confronto accurato.
Importante punto trascurato negli esempi precedenti.
I seguenti 2 esempi contano le schede espanse
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
I seguenti 2 contano le schede non estese.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
così
Expanded nonexpanded
$'nn\tnn' 10 5
Sembra che tutta la risposta non dia il numero di riga della linea più lunga. Il seguente comando può fornire il numero di riga e la lunghezza approssimativa:
$ cat -n test.txt | awk '{print "longest_line_number: " $1 " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11
awk '{print length}' test.txt | sort -rn | head -1
. Se hai bisogno anche del contenuto della linea attuale, allora awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Ecco i riferimenti del pescatore
cat filename | awk '{print length, $0}'|sort -nr|head -1
Solo per divertimento, ecco la versione di Powershell:
cat filename.txt | sort length | select -last 1
E per ottenere solo la lunghezza:
(cat filename.txt | sort length | select -last 1).Length
sort
prendere nomefile.txt come argomento? Quindi il gatto è inutile perché sort length filename.txt | select -last 1
evita una pipe e un processo che copia semplicemente i dati.
Sono in un ambiente Unix e lavoro con file compressi con dimensioni di pochi GB. Ho testato i seguenti comandi usando un file gzipped da 2 GB con lunghezza record di 2052.
zcat <gzipped file> | wc -L
e
zcat <gzipped file> | awk '{print length}' | sort -u
I tempi erano in media
117 secondi
109 secondi
Ecco la mia sceneggiatura dopo circa 10 prove.
START=$(date +%s) ## time of start
zcat $1 | wc -L
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
START=$(date +%s) ## time of start
zcat $1 | awk '{print length}' | sort -u
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
awk
versione benefici della memorizzazione nella cache del blocco disco della wc
versione che è in esecuzione per prima (e semina la cache del disco). Dovresti randomizzare l'ordine di chi viene chiamato per primo nelle dieci esecuzioni per far sì che questo argomento rimanga.
Variazione sul tema.
Questo mostrerà tutte le linee che hanno la lunghezza della linea più lunga trovata nel file, mantenendo l'ordine in cui appaiono nella fonte.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Quindi miofile
x
mn
xyz
123
abc
darà
xyz
123
abc
Se stai usando MacOS e ricevi questo errore:
wc: illegal option -- L
riscontrando non è necessario installare GNU sipmly farlo.
Se tutto ciò che vuoi fare è ottenere il conteggio dei caratteri nella riga più lunga del file e stai utilizzando OS X Run:
awk '{print length}' "$file_name" | sort -rn | head -1
Qualcosa come questo;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Uscite:
The longest line in the file my_file has 117 characters
-c -l -m -w
opzioni sono POSIX.-L
è un GNUismo.