У меня есть файл "file.txt", который содержит следующее:

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

(На самом деле это несколько тысяч, но я новичок в Linux и хочу сделать это проще.)

Я хочу, только в оболочке, сортировать список по длине каждой строки, в любом направлении. Наименьший первый или последний.

Затем я хочу, чтобы он напечатал самую короткую строку "привет" и, возможно, сказал мне, в какой строке он находится, и количество символов. Как бы я это сделал, желательно без использования Awk?

1 ответ1

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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .