LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: pluskid

请问在AWK中如何打印第N个字段以及其后的所有字段?

[复制链接]
 楼主| 发表于 2006-3-8 13:14:31 | 显示全部楼层
那个就是C语言里面都有的那个运算符啦!
比如:
  1. foo?bar1:bar2
复制代码
如果foo为真就是bar1,否则就是bar2
回复 支持 反对

使用道具 举报

发表于 2006-3-8 13:49:09 | 显示全部楼层
Post by pluskid
那个就是C语言里面都有的那个运算符啦!
比如:

  1. foo?bar1:bar2
复制代码

如果foo为真就是bar1,否则就是bar2


正解,hehe,
回复 支持 反对

使用道具 举报

发表于 2006-3-8 14:05:04 | 显示全部楼层
另外的一个方法就是用FS="",也就是说将每一个字符作为单独的域来看待,这样不论是什么,都将按原样打印。
  1. awk 'BEGIN{FS=""}{for(i=x;i<=NF;i++){printf "%s",$i}{print ""}}'
复制代码
但是有一个地方要注意的是算域的时候就得一个一个数了。
回复 支持 反对

使用道具 举报

发表于 2006-3-8 14:21:54 | 显示全部楼层
Post by pluskid
那个就是C语言里面都有的那个运算符啦!
比如:
  1. foo?bar1:bar2
复制代码
如果foo为真就是bar1,否则就是bar2
这个上学的时候好象学过的,呵呵,长见识了。谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-8 21:14:06 | 显示全部楼层
Post by yongjian
另外的一个方法就是用FS="",也就是说将每一个字符作为单独的域来看待,这样不论是什么,都将按原样打印。
  1. awk 'BEGIN{FS=""}{for(i=x;i<=NF;i++){printf "%s",$i}{print ""}}'
复制代码
但是有一个地方要注意的是算域的时候就得一个一个数了。

这个可能不好用,因为前面的字段长度不一定是固定的,有时侯用tab分隔时看起来是对齐的,但是事实上有时侯相差几个字符。
回复 支持 反对

使用道具 举报

发表于 2006-3-8 23:24:58 | 显示全部楼层
嗯。那倒是。
回复 支持 反对

使用道具 举报

发表于 2006-3-8 23:57:31 | 显示全部楼层
  1. awk '{a=index($0,$10);print substr($0,a)}'
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-3-9 08:27:32 | 显示全部楼层
Post by yongjian
  1. awk '{a=index($0,$10);print substr($0,a)}'
复制代码


yongjian兄,这个方法我也想过,但是如果在第10列之前,就存在与第10列相同字符的列的话,就有可能达不到需要的效果了.
回复 支持 反对

使用道具 举报

发表于 2006-3-9 13:18:45 | 显示全部楼层
Good point. That will have problem.
  1. awk 'BEGIN{FS="[ ]"}{$10="n"$10;t=index($0,$10);print substr($0,(t+1))}'
复制代码
这样看看?取了个巧,重新给$10赋了个值,使它不可能有重复的项。还有就是用了"[ ]",主要是考虑到如果文件名中只有一个空格,打印的正好和原来的一样。如果多余一个或是其他不可见字符,将不会被匹配,同样会原样打印。Johnny兄帮看看还有什么没有考虑的情况。
回复 支持 反对

使用道具 举报

发表于 2006-3-9 15:24:47 | 显示全部楼层
Post by yongjian
Good point. That will have problem.
  1. awk 'BEGIN{FS="[ ]"}{$10="n"$10;t=index($0,$10);print substr($0,(t+1))}'
复制代码
这样看看?取了个巧,重新给$10赋了个值,使它不可能有重复的项。还有就是用了"[ ]",主要是考虑到如果文件名中只有一个空格,打印的正好和原来的一样。如果多余一个或是其他不可见字符,将不会被匹配,同样会原样打印。Johnny兄帮看看还有什么没有考虑的情况。


不错的方法,yongjian兄思路果然开阔,有一点就是这样一来,你要重新判断你要显示的column $i 这个i 到底是多少,for example:



  1. -rwxr-xr-x  1 genesis users 1182 Mar  9 10:45 self-source
  2. -rwxr-xr-x  1 genesis users  487 Mar  9 11:35 set-test
  3. -rwxr-xr-x  1 genesis users  164 Mar  6 13:00 setty
  4. -rwxr-xr-x  1 genesis users  623 Mar  7 15:43 spawn.sh
  5. -rwxr-xr-x  1 genesis users  181 Feb 23 16:27 t-out
  6. -rwxr-xr-x  1 genesis users  328 Feb 21 12:46 tifs
  7. -rwxr-xr-x  1 genesis users  599 Feb 21 16:14 timed-input
  8. -rwxr-xr-x  1 genesis users  370 Feb 23 15:30 timeout
  9. -rwxr-xr-x  1 genesis users  212 Feb 21 16:47 tmout
  10. -rwxr-xr-x  1 genesis users  582 Feb 21 13:33 trpexit
  11. lrwxrwxrwx  1 genesis users    5 Mar  6 13:00 tty -> setty

复制代码


如果你要从genesis这一列开始显示,其实就应该是$4了,而不是$3,

FS="[ ]",非常妙,又学到一招
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表