2011-12-06 36 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