У меня есть файл с путями к файлам. Глубина каталогов бывает различной длины и имени пути. Я хотел бы сопоставить два каталога назад (два /) и удалить совпадение, создав новый файл с результатами.
например:
/dir1/dir2/dir3/dir4/dir5/dir6/dir7/output_job3344.xml
/dir1/dir2/dir3/dir4/dir5/otherfile.txt
результат будет:
/dir1/dir2/dir3/dir4/dir5/dir6/
/dir1/dir2/dir3/dir4/
Я пробовал примерно так:
awk -F'/*./.*$' '{print $0}' deep.list
но это не сработало.
Ваша идея умная, но требует исправления. Вот как вы, вероятно, имели в виду:
awk -F'[^/]*/[^/]*$' '{print $1}' deep.list
Пояснение:
Во-первых, вы, вероятно, ошиблись .*
так как *.
.
Затем *
модификатор жадный, поэтому вам нужно следить за тем, чтобы он не совпадал больше, чем вы планировали! Решение простое, хотя и немного менее читаемое: используйте [^/]*
вместо того .*
. Таким образом вы сопоставляете любые символы, кроме /
.
Наконец, $0
представляет собой всю строку, которая не была изменена ни в малейшей степени путем указания специально созданного настраиваемого разделителя полей. В этом случае вы хотите вместо этого напечатать первое поле: $1
.
Вот другой подход, чем два ответы связаны @ ender.qa:
awk '{gsub("[^/]+/[^/]+$","");print}' deep.list
И один, использующий цикл:
awk -F/ '{for(i=1;i<=NF-2;i++){printf "%s/",$i}; print ""}' deep.list
Метод подстановки проще реализовать в Perl:
perl -lape 's"[^/]+/[^/]+$""' deep.list
или sed:
sed -E 's"[^/]+/[^/]+$""' deep.list