awk行处理$NF

awk行处理$NF,awk,Awk,我对awk处理简单的事情有问题。 但对我来说并不简单明了。 这就是我需要解析的内容: $ cat file /dir1/dir11/file1 /dir10/dir103/file2 /dir2/dir21/dir221/file3 我想要的是,有单独的文件路径(没有文件名),比如: 我已经试过了: $ cat file | awk -F"/" '{for (i=1;i<NF;i++) print $i}' dir1 dir11 dir10 dir103 dir2 dir21 di

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

$ cat file
/dir1/dir11/file1
/dir10/dir103/file2
/dir2/dir21/dir221/file3
我想要的是,有单独的文件路径(没有文件名),比如:

我已经试过了:

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

dir1
dir11

dir10
dir103

dir2
dir21
dir221
但是路径中仍然缺少
/

此awk应该可以工作:

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

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

$ awk '{NF--}1' FS='/' OFS='/' file
/dir1/dir11
/dir10/dir103
/dir2/dir21/dir221
awk '{sub(/\/[^/]+$/,"")}1' file
否则,只需将OFS='/'添加到上一个命令:

$ awk '{$NF=""}1' FS='/' OFS='/' file
或者使用
sed
进行简单替换:

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

以下是使用awk的另一种方法:

$ awk '{NF--}1' FS='/' OFS='/' file
/dir1/dir11
/dir10/dir103
/dir2/dir21/dir221
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

谢谢大家。:)我只是好奇,当我想把OFS改成“\”时,在这个例子中怎么会这样?@molni:你想用反斜杠作为OFS还是正斜杠?上面的示例仅显示正斜杠。
$ cat file
/dir1/dir11/file1
/dir10/dir103/file2
/dir2/dir21/dir221/file3
$ awk '{sub(/\/[^/]+$/,"")}1' file
/dir1/dir11
/dir10/dir103
/dir2/dir21/dir221