2011-12-06 37 views
3

也就是說,在N之後提取字段的建議工作是什麼? 我無法在awk中找到任何快捷方式來執行此操作。awk相當於cut -f2-

什麼是最有效和簡單的方法來做到這一點?

+0

你看過正則表達式嗎?我的awk-fu很弱,但是在Perl中,我會'm/(?:[^@]+)@(.*)/; $ foo = $ 3;'分隔符'@'。訣竅是使用'(?:[^ @] +)@'跳過初始字段。 – moshbear

+0

WOW Perl遠遠超出了我的理解......這就是爲什麼我仍然堅持使用awk :) – MeaCulpa

+0

學習擴展的POSIX正則表達式絕對值得你效仿。 – moshbear

回答

7

我用的是這樣的:

awk '{for (i=2;i<=NF;i++) printf $i" ";printf "\n"}' file 

編輯:

對於仿製藥的使用:

/home/sirch> echo 1:2:3:4:5 | awk 'BEGIN{FS=OFS=":"}{for (i=2;i<=NF;i++)a=(a)?a OFS $i:$i;print a;a=""}' 
2:3:4:5 
/home/sirch> echo 1,2,3,4,5 | awk 'BEGIN{FS=OFS=","}{for (i=2;i<=NF;i++)a=(a)?a OFS $i:$i;print a;a=""}' 
2,3,4,5 
/home/sirch> echo 1,2,3,4,5 | awk 'BEGIN{FS=OFS=","}{for (i=3;i<=NF;i++)a=(a)?a OFS $i:$i;print a;a=""}' 
3,4,5 
/home/sirch> echo 1,2,3,4,5 | awk 'BEGIN{FS=OFS=","}{for (i=3;i<=4;i++)a=(a)?a OFS $i:$i;print a;a=""}' 
3,4 

FS設置輸入域分隔符,OFS設置輸出字段分隔符。 如果您想使用「:」e。 G。作爲分隔符,將FS和OFS設置爲「:」。 您也可以使用regexp作爲分隔符。

編輯2:

如果你有興趣在一個完整實現削減的awk,到這裏看看:

http://www.gnu.org/s/gawk/manual/html_node/Cut-Program.html

HTH克里斯

+0

邏輯,我想不出任何其他更好的性能變通。謝謝! – MeaCulpa

+0

不適用於非空白分隔符。 – moshbear

+0

當然不是。如果你想使用另一個分隔符,用FS =「foobar」或-F指定它。 – Chris

0

不是像你一樣克里斯的解決方案但是這也會在第一個字段後打印所有內容:

awk '{$1=""; print $0}' file 
+0

這與切割不一樣;它將以字段分隔符開始。 –

+0

是的,很好的說明。 – telenachos