Перенаправление многострочного вывода на несколько файлов

у меня есть список URL-адресов, и я хотел бы определить, что такое каталог, а что нет:

https://www.example.com/folder/
https://www.example.com/folder9/
https://www.example.com/folder/file.sh
https://www.example.com/folder/text

Я могу использовать grep -e /$ чтобы найти, что есть что, но я хотел бы сделать встроенную команду, где я могу перенаправить вывод на основе этой логики.

Я понимаю, что awk может иметь ответ здесь, но у вас недостаточно опыта в awk для этого.

что-то типа:

cat urls | if /$ matches write to folders.txt else write to files.txt

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

3 ответов


да awk является отличным выбором для этого:

awk '/\/$/ { print > "folders.txt"; next }
           { print > "files.txt" }' urls.txt
  • /\/$/ { print > "folders.txt"; next } если строка заканчивается на/, запишите ее в папки.TXT и перейти к следующей строке
  • { print > "files.txt" } добавить все остальные строки в файлах.txt

вы можете использовать выражение /\/[[:space:]]*$/ вместо /\/$/ в случае, если у вас есть пробелы в файл.


все, что вам нужно, это:

awk '{print > ((/\/$/ ? "folders" : "files")".txt")}' urls.txt

с заменой процессов coreutils, grep и bash:

<urls tee >(grep '/$' > folders.txt) >(grep -v '/$' > files.txt) > /dev/null