sh/bash/dash/ksh/zsh等Shell脚本
-
hjjdebug
- 帖子: 94
- 注册时间: 2009-04-21 9:48
#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
- 来自: 上海
#2
帖子
由 kamui0523 » 2010-05-05 20:24
awk -F\ '{print$1,$6,$7,$8,$9,$10,$11,$12}' file
-
hjjdebug
- 帖子: 94
- 注册时间: 2009-04-21 9:48
#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
- 来自: 上海
#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的方式,你会发现你提取的数据会不完整
除非你所有的行列数都是一致的