Оболонка Linux - сортуйте текстовий файл за довжиною кожного рядка та надрукуйте найкоротше слово


0

У мене є файл "file.txt", який містить таке:

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

(Насправді це кілька тисяч, але я новачок у Linux, і хочу зробити це легше.)

Я хочу, лише в оболонці, сортувати список за довжиною кожного рядка, будь-яким напрямком. Найменший перший чи останній.

Тоді я хочу, щоб він надрукував найкоротший рядок "привіт" і, можливо, повідомив мені, на якому рядку він знаходиться, та кількість символів. Як би я це зробив, бажано, не використовуючи Awk?


1
Чи означає "лише в оболонці", що ви хочете також уникнути sort?
choroba

1
Чому ти хочеш уникати awk? Це домашнє завдання?
DavidPostill

Відповіді:


3

Команди

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.