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.
198
Usando o wc (GNU coreutils) 7.4:
wc -L filename
dá:
101 filename
-c -l -m -w
opções são POSIX.-L
é um GNUism.-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á nacoreutils
fórmula, que instala todos os coreutils do GNU com umg
prefixo.Para referência: localizando a linha mais longa em um arquivo
fonte
END{}
bloco.fonte
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:
fonte
< "$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
dá
fonte
wc
de produzir o nome de arquivo :)Imprime o comprimento, número da linha e conteúdo da linha mais longa
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 atualfonte
wc -L
é a melhor solução que vi até agora.wc -L
levou 3 segundoswc -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
As 2 seguintes contam guias não expandidas.
tão
fonte
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:
fonte
awk '{print length}' test.txt | sort -rn | head -1
. Se você precisa de conteúdo da linha atual é muito, entãoawk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Em perl:
isso apenas imprime a linha, não o comprimento também.
fonte
Aqui estão as referências da resposta
http://wtanaka.com/node/7719
fonte
Apenas por diversão, aqui está a versão do Powershell:
E para obter apenas o comprimento:
fonte
sort
usar filename.txt como argumento? Então o gato é inútil porquesort 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.
fonte
awk
versão se beneficiar do armazenamento em cache do bloco de disco dawc
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.
Então meu arquivo
darei
fonte
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
fonte