Linux Shell - Classifique um arquivo de texto pelo comprimento de cada linha e imprima a palavra mais curta

0

Eu tenho um arquivo "arquivo.txt" que contém o seguinte:

This is many letters
This is few
Hi
This is a very long sentence.

(Na verdade, tem alguns milhares de anos, mas eu sou novo no Linux e quero facilitar as coisas.)

Eu quero, apenas no shell, classificar a lista pelo comprimento de cada linha, em qualquer direção. Menor primeiro ou último.

Então eu quero imprimir a linha mais curta, "oi" e possivelmente dizer em que linha está, e o número de caracteres. Como eu faria isso, de preferência sem usar o Awk?

    
por Avery Kucan 25.10.2016 / 23:15

1 resposta

3

Os comandos

line_num=0
while IFS= read -r line
do
    echo "${#line} $((++line_num)) $line"
done < file.txt > tmpfile.txt

criará um arquivo chamado tmpfile.txt , que se parece com isto:

20 1 This is many letters
11 2 This is few
2 3 Hi
29 4 This is a very long sentence.

onde cada linha é precedida por seu comprimento e seu número de linha. Então sort -n tmpfile.txt produzirá:

2 3 Hi
11 2 This is few
20 1 This is many letters
29 4 This is a very long sentence.

, que é classificado por comprimento de linha. Você pode enviar isso para head -n1 para obter a primeira linha (isto é, a linha mais curta) ou tail -n1 para obter a última linha (ou seja, a linha mais longa). Ou use sort -nr para reverter o pedido então você pode usar head -n1 para obter a linha mais longa. (Isso pode ser infinitesimalmente mais eficiente do que usar tail .)

Se você quiser ver apenas a linha mais curta, você pode usar um pipe e evitar criar o arquivo temporário:

line_num=0
while IFS= read -r line
do
    echo "${#line} $((++line_num)) $line"
done < file.txt | sort -n | head -n1

Isso provavelmente seria mais eficiente em awk .

    
por 26.10.2016 / 00:10