2013-07-23 67 views
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 

但仍然缺少路徑中/

回答

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 

否則只需添加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