2013-07-23 3 views
2

У меня проблема с awk-обработкой простой вещи. Но не простой и понятный для меня. Это то, что мне нужно разобрать:

$ cat file 
/dir1/dir11/file1 
/dir10/dir103/file2 
/dir2/dir21/dir221/file3 

И что желателен для меня, чтобы иметь отделенный путь к файлам (без имен файлов), как:

/dir1/dir11 
/dir10/dir103 
/dir2/dir21/dir221 

Я Allready попытался это:

$ cat file | awk -F"/" '{for (i=1;i<NF;i++) print $i}' 

dir1 
dir11 

dir10 
dir103 

dir2 
dir21 
dir221 

и это:

$ cat file | awk -F"/" '{for (i=1;i<NF;i++) printf $i}' 
dir1dir11dir10dir103dir2dir21dir221 

и лучшие результаты:

$ cat file | awk -F"/" '{ $NF=""; print}' 
dir1 dir11 
dir10 dir103 
dir2 dir21 dir221 

Но еще отсутствует / в пределах пути.

ответ

1

Это AWK должно работать:

awk 'BEGIN{FS=OFS="/"} {$NF=""}'1 file 
+0

Спасибо, все. :) Мне просто интересно, когда я хочу изменить OFS на «\», как это может быть в этом примере? – molni

+0

Добро пожаловать. – anubhava

+0

@molni: Вы хотите использовать обратную косую черту как OFS или косую черту? В приведенном выше примере показан только косой чертой. – anubhava

0

Вы должны установить разделитель полей вывода, если изменить запись. Я бы просто уменьшаем количество полей, если у вас есть GNU awk:

$ awk '{NF--}1' FS='/' OFS='/' file 
/dir1/dir11 
/dir10/dir103 
/dir2/dir21/dir221 

Else просто добавить OFS='/' к вашей последней команды:

$ awk '{$NF=""}1' FS='/' OFS='/' file 

Или с простой подстановки, используя sed:

$ sed 's%/[^/]*$%%' file 
/dir1/dir11 
/dir10/dir103 
/dir2/dir21/dir221 
+0

Это не работает на OSX, но работает на Linux – anubhava

+0

Исправлена ​​хорошая точка @anubhava. –

0

Вот еще один способ с awk:

awk '{sub(/\/[^/]+$/,"")}1' file 

Выход:

$ cat file 
/dir1/dir11/file1 
/dir10/dir103/file2 
/dir2/dir21/dir221/file3 
$ awk '{sub(/\/[^/]+$/,"")}1' file 
/dir1/dir11 
/dir10/dir103 
/dir2/dir21/dir221 
Смежные вопросы