Команды
line_num=0
while IFS= read -r line
do
echo "${#line} $((++line_num)) $line"
done < file.txt > tmpfile.txt
создаст файл с именем tmpfile.txt , который выглядит следующим образом:
20 1 This is many letters
11 2 This is few
2 3 Hi
29 4 This is a very long sentence.
где каждой строке предшествует ее длина и номер строки.
Тогда sort -n tmpfile.txt приведет к:
2 3 Hi
11 2 This is few
20 1 This is many letters
29 4 This is a very long sentence.
который отсортирован по длине строки.
Затем вы можете отправить это head -n1 чтобы получить первую строку (т. Е. Самую короткую строку), или tail -n1 чтобы получить последнюю строку (т. Е. Самую длинную строку).
Или используйте sort -nr чтобы изменить порядок, так что вы можете использовать head -n1 чтобы получить самую длинную строку.
(Это может быть бесконечно более эффективно, чем использование tail .)
Если вы хотите видеть только самую короткую строку, вы можете использовать канал и избегать создания временного файла:
line_num=0
while IFS= read -r line
do
echo "${#line} $((++line_num)) $line"
done < file.txt | sort -n | head -n1
Это, вероятно, будет более эффективным в awk .