С помощью gnu awk
вы можете сделать это
awk 'match($0,/(cat|dog|fish)/,a) {print >a[1]".txt";next} {print >"rest.txt"}' file
Затем в качестве имени файла будет использована группа захвата #1
.Вы можете задавать столько слов, сколько хотите, и для каждого слова в группе создается новый файл, если он соответствует.Затем остальное печатается в rest.txt
. Это также будет работать с регулярным выражением.Можно использовать более сложное выражение.
Оно сломается, если в одной строке будет более одного триггерного слова.
Та же версия awk
, что и у RomanPerekhrest, но некоторые легче читаются ипроще для расширения.
awk '/fish/ {print > "fish.txt"; next} /cat/ {print > "cat.txt"; next} /dog/ {print > "dog.txt"; next} 1' input.txt > /
/tmp/_fc.txt > && mv /tmp/_fc.txt input.txt
Еще лучшее форматирование:
awk '
/fish/ {print > "fish.txt"; next}
/cat/ {print > "cat.txt"; next}
/dog/ {print > "dog.txt"; next}
1' input.txt > /tmp/_fc.txt \
&& mv /tmp/_fc.txt input.txt