2

我对 awk 处理简单的事情有疑问。但对我来说并不简单明了。这是我需要解析的:

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

我想要的是文件的分隔路径(没有文件名),例如:

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

我已经尝试过这个:

$ 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

/但仍然在路径中丢失。

4

3 回答 3

1

这个 awk 应该可以工作:

awk 'BEGIN{FS=OFS="/"} {$NF=""}'1 file
于 2013-07-23T12:58:11.030 回答
0

如果修改记录,则需要设置输出字段分隔符。如果你有,我只会减少字段的数量GNU awk

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

否则只需添加OFS='/'到您的最后一个命令:

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

或者使用简单的替换sed

$ sed 's%/[^/]*$%%' file
/dir1/dir11
/dir10/dir103
/dir2/dir21/dir221
于 2013-07-23T12:59:08.310 回答
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
于 2013-07-23T13:10:40.057 回答