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.

È stato utile?

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

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

http://wtanaka.com/node/7719

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.

  1. zcat <gzipped file> | wc -L

e

  1. zcat <gzipped file> | awk '{print length}' | sort -u

I tempi erano in media di marea

  1. 117 secondi

  2. 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top