Как написать в linux скрипт bash,который будет сортировать слова разной длины из одного txt файла в 3 других?

Как написать в linux скрипт bash,который будет сортировать слова разной длины из одного txt файла в 3 других, например: в файле text.txt есть несколько слов разной длины и , нужно слова, с длиной больше 7 символов поместить в в файл long.txt , слова с длиной в 5-7 символов поместить в mid.txt , а слова с длиной меньше 4-ёх поместить в short.txt пытался использовать команду sed,но в итоге программа выдала ошибку


Ответы (3 шт):

Автор решения: KoVadim

Мне кажется, для такой задачи лучше подходит grep, главное правильно написать регулярку

grep -oE '^.{,5}$' filename.txt

покажет все слова длинной от нуля до 5 символов включительно. Да, пробелы тоже посчитаются, но их можно отфильтровать

grep -oE '^[^ ]{,5}$' filename.txt

а вот такая регулярка выделит слова от 10 до 15 символов включительно

grep -oE '^.{10,15}$' filename.txt

и использую перенаправление в файл (> new_file.txt) результат легко отправить куда нужно. Иного три строки и слова раскиданы по файлам.

Нужные длины и имена файлов подбирайте самостоятельно.

→ Ссылка
Автор решения: pazhitnov

Проблема с sed в том, что это редактор строки, а не текста. Можно записать в файл, можно скипнуть строки, но нельзя скипнутые строки направить в другой файл.

Проблема с grep в том, что файл читается три раза, что делает затруднённым использование в пайпах, ну и вообще читать файл три раза не красиво.

Тут лучше подходит sed, который как раз для таких случаев предназначен:

awk 'BEGIN { f1="file1.txt"; f2="file2.txt"; f3="file3.txt"; } { if(length($1)<5) print $1 > f1; else if(length($1)>=5 && length($1)<8) print $1 > f2; else print $1 > f3 }' filename.txt

Лучше, конечно же, весь скрипт убрать в файл и запускать его с ключом -f.

→ Ссылка
Автор решения: PotroNik

Если говорить о решение на bash, то конструкция будет выглядеть следующим образом:

#цикл по записям из основного файла
while read line; do
#${#...} - получаем длину текущей строки
    if [[ ${#line} -gt 7 ]]; then
        echo "${line}" >> long.txt
    elif [[ ${#line} -ge 5 && ${#line} -le 7 ]]; then
        echo "${line}" >> mid.txt
    elif [[ ${#line} -le 4 ]]; then
        echo "${line}" >> short.txt
    fi
done< <(cat text.txt)
→ Ссылка