Estou procurando uma maneira simples de encontrar o comprimento da linha mais longa em um arquivo. Idealmente, seria um simples comando bash shell em vez de um script.
Estou procurando uma maneira simples de encontrar o comprimento da linha mais longa em um arquivo. Idealmente, seria um simples comando bash shell em vez de um script.
Respostas:
Usando o wc (GNU coreutils) 7.4:
wc -L filename
dá:
101 filename
-L
depende da localidade. Alguns caracteres (no sentido de bytes e multibytes) podem até não ser contados!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
está na coreutils
fórmula, que instala todos os coreutils do GNU com um g
prefixo.
awk '{print length, $0}' Input_file |sort -nr|head -1
Para referência: localizando a linha mais longa em um arquivo
END{}
bloco.
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
Apenas para fins divertidos e educacionais, a solução shell POSIX pura , sem uso inútil de gato e sem bifurcação para comandos externos. Leva o nome do arquivo como primeiro argumento:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$1"
pode facilmente ler do stdin. Com um teste $#
, poderia até fazer as duas coisas, dependendo do número de argumentos. Simplesmente não há necessidade de gatos inúteis neste mundo. Iniciantes devem ser ensinados em conformidade desde o início.
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Imprime o comprimento, número da linha e conteúdo da linha mais longa
perl -ne 'print length()." line $. $_"' myfile | sort -n
Imprime uma lista ordenada de todas as linhas, com números e comprimentos de linha
.
é o operador de concatenação - é usado aqui depois que length ()
$.
é o número
$_
da linha atual é a linha atual
wc -L
é a melhor solução que vi até agora.
wc -L
levou 3 segundos
wc -L
conte apenas os registros numéricos - esse Q estava prestes a encontrar a linha mais longa - não exatamente o mesmo, portanto, essa comparação não é precisa.
Ponto negligenciado importante nos exemplos acima.
Os 2 exemplos a seguir contam guias expandidas
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
As 2 seguintes contam guias não expandidas.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
tão
Expanded nonexpanded
$'nn\tnn' 10 5
Parece que toda a resposta não indica o número da linha mais longa. O comando a seguir pode fornecer o número da linha e o tamanho aproximado:
$ 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 você precisa de conteúdo da linha atual é muito, então awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Aqui estão as referências da resposta
cat filename | awk '{print length, $0}'|sort -nr|head -1
Apenas por diversão, aqui está a versão do Powershell:
cat filename.txt | sort length | select -last 1
E para obter apenas o comprimento:
(cat filename.txt | sort length | select -last 1).Length
sort
usar filename.txt como argumento? Então o gato é inútil porque sort length filename.txt | select -last 1
evita um cano e um processo que apenas copia os dados.
Estou em um ambiente Unix e trabalho com arquivos compactados com gzip de alguns GBs. Testei os seguintes comandos usando um arquivo compactado em gb de 2 GB com comprimento de registro de 2052.
zcat <gzipped file> | wc -L
e
zcat <gzipped file> | awk '{print length}' | sort -u
Os tempos estavam em média
117 segundos
109 segundos
Aqui está o meu script após cerca de 10 execuções.
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
versão se beneficiar do armazenamento em cache do bloco de disco da wc
versão que está sendo executada primeiro (e semear o cache do disco). Você precisaria aleatoriamente a ordem de quem é chamado primeiro nas dez execuções para fazer esse argumento continuar.
Variação sobre o tema.
Este mostrará todas as linhas com o comprimento da linha mais longa encontrada no arquivo, mantendo a ordem em que aparecem na fonte.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Então meu arquivo
x
mn
xyz
123
abc
darei
xyz
123
abc
Se você estiver usando o MacOS e estiver recebendo este erro:
wc: illegal option -- L
não é necessário instalar o GNU sipmly, faça isso.
Se tudo o que você deseja fazer é obter a contagem dos caracteres na linha mais longa do arquivo e você estiver usando a execução do OS X:
awk '{print length}' "$file_name" | sort -rn | head -1
Algo assim;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Saídas:
The longest line in the file my_file has 117 characters
-c -l -m -w
opções são POSIX.-L
é um GNUism.