shell 提取头部和尾部数据 ?

sh/bash/dash/ksh/zsh等Shell脚本
回复
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

shell 提取头部和尾部数据 ?

#1

帖子 hjjdebug » 2010-05-05 18:02

比如下面的文本数据,我想舍弃中间部分,保留头部,尾部。

代码: 全选

7 0.16   202       192       DNS      Standard query response A 58.251.62.231
8 0.22   202       192       DNS      Standard query response A 218.60.11.43 A 123.130.125.48
170 28.9   192       202       DNS      Standard query A stun.com
171 28.9   202       192       DNS      Standard query response A 60.28.190.106 A 60.28.190.105
结果为:

代码: 全选

7    Standard query response A 58.251.62.231
8    Standard query response A 218.60.11.43 A 123.130.125.48
170    Standard query A stun.com
171    Standard query response A 60.28.190.106 A 60.28.190.105
请问用sed 或者 awk 应该如何实现 ?
谢谢!
kamui0523
帖子: 547
注册时间: 2008-05-14 18:53
来自: 上海

Re: shell 提取头部和尾部数据 ?

#2

帖子 kamui0523 » 2010-05-05 20:24

awk -F\ '{print$1,$6,$7,$8,$9,$10,$11,$12}' file
三年Linux使用经验,两年Ubuntu使用经验
提供各种企业解决方案
Ubuntu QQ群:66320976
Linux Blog
http://deephell.72pines.com
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: shell 提取头部和尾部数据 ?

#3

帖子 hjjdebug » 2010-05-08 13:21

针对此例是可行, 但有时候尾部可能会更多, 仅用枚举总感觉不是好办法。

如果一行有N 个列, 保留前面两列,去掉中间3列, 保留后面N-5 列。
这是一种较简单的例子。

更一般的思考方法是。
一行最多由N列, 保留前面N1列,去掉中间N2列,保留后面N-N1-N2列。
应该怎样写 ?

程序要完善,还要判断当N<N1 的情况,当N<N2 情况,当N<(N1+N2)
情况,似此是不是awk 不可行, 而必须借助于perl 等脚本 或C/C++ 等程序语言 ?

感谢2楼答复!
kamui0523
帖子: 547
注册时间: 2008-05-14 18:53
来自: 上海

Re: shell 提取头部和尾部数据 ?

#4

帖子 kamui0523 » 2010-05-08 16:51

8 0.22 202 192 DNS Standard query response A 218.60.11.43 A 123.130.125.48
170 28.9 192 202 DNS Standard query A stun.com
像你这样的文本
后面的几位都不是一致的
提取数据需要要靠分隔符,这里最好的分隔符就是空格,但是你严格用N的方式,你会发现你提取的数据会不完整
除非你所有的行列数都是一致的
三年Linux使用经验,两年Ubuntu使用经验
提供各种企业解决方案
Ubuntu QQ群:66320976
Linux Blog
http://deephell.72pines.com
回复