Ottenere lunghezza della riga più lunga in un file
Domanda
Sto cercando un modo semplice per trovare la lunghezza della riga più lunga in un file. Idealmente, sarebbe un semplice comando di shell bash al posto di uno script.
Soluzione
Uso di wc (coreutils GNU) 7.4:
wc -L filename
dà:
101 filename
Altri suggerimenti
awk '{print length, $0}' Input_file |sort -nr|head -1
Per riferimento: Trovare la linea più lunga in un file
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
Solo per divertimento e scopo educativo, il POSIX pura soluzione di shell , senza l'uso inutile del gatto e non biforcazione ai comandi esterni. Prende il nome del 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"
wc -L < filename
dà
101
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Consente di stampare la lunghezza, numero di riga, e il contenuto della linea più lunga
perl -ne 'print length()." line $. $_"' myfile | sort -n
Consente di stampare un elenco ordinato di tutte le linee, con i numeri di riga e lunghezze
.
è l'operatore di concatenazione - è usato qui dopo la lunghezza ()
$.
è il numero di riga corrente
$_
è la linea corrente
punto trascurato importante negli esempi precedenti.
Gli esempi seguenti 2 COUNT tabulazione espansi
wc -L <"${SourceFile}"
# or
expand --tabs=1 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Il conteggio seguente 2 schede non expaned.
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
appare tutta la risposta non dare il numero di riga della riga più lunga. A seguito di comando può dare il numero della linea e circa lunghezza:
$ 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
in Perl:
perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1
Questo stampa solo la linea, non la sua lunghezza troppo.
Qui ci sono riferimenti del anwser
cat filename | awk '{print length, $0}'|sort -nr|head -1
Solo per divertimento, ecco la versione PowerShell:
cat filename.txt | sort length | select -last 1
E per ottenere solo la lunghezza:
(cat filename.txt | sort length | select -last 1).Length
Sono in un ambiente Unix, e lavorare con i file compressi con gzip che sono un paio di GB di dimensione. Ho provato i seguenti comandi utilizzando un file gzip 2 GB con una lunghezza record di 2052.
-
zcat <gzipped file> | wc -L
e
-
zcat <gzipped file> | awk '{print length}' | sort -u
I tempi erano in media di marea
-
117 secondi
-
109 secondi
Ecco il mio script dopo circa 10 corse.
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"
variazione sul tema.
Questo mostrerà tutte le linee con la lunghezza della linea più lunga trovata nel file, mantenendo l'ordine in cui appaiono nel sorgente.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
miofile
x
mn
xyz
123
abc
darà
xyz
123
abc