Как написать в linux скрипт bash,который будет сортировать слова разной длины из одного txt файла в 3 других?
Как написать в linux скрипт bash,который будет сортировать слова разной длины из одного txt файла в 3 других, например: в файле text.txt есть несколько слов разной длины и , нужно слова, с длиной больше 7 символов поместить в в файл long.txt , слова с длиной в 5-7 символов поместить в mid.txt , а слова с длиной меньше 4-ёх поместить в short.txt пытался использовать команду sed,но в итоге программа выдала ошибку
Ответы (3 шт):
Мне кажется, для такой задачи лучше подходит grep, главное правильно написать регулярку
grep -oE '^.{,5}$' filename.txt
покажет все слова длинной от нуля до 5 символов включительно. Да, пробелы тоже посчитаются, но их можно отфильтровать
grep -oE '^[^ ]{,5}$' filename.txt
а вот такая регулярка выделит слова от 10 до 15 символов включительно
grep -oE '^.{10,15}$' filename.txt
и использую перенаправление в файл (> new_file.txt) результат легко отправить куда нужно. Иного три строки и слова раскиданы по файлам.
Нужные длины и имена файлов подбирайте самостоятельно.
Проблема с 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.
Если говорить о решение на 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)