LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1320|回复: 17

查找匹配行,再替换?[已解决]

[复制链接]
发表于 2004-3-11 17:47:54 | 显示全部楼层 |阅读模式
我有个文件,需要找到第二个域不是以H开头的行,把这行的倒数第二个域的0.00改成1.00,如下面的例子

1    N   ALA    35   1.00  0.00      U
4    HT3 ALA    35   0.00  0.00      U
5    CA  ALA    35   1.00  0.00      U
307  N   HSD    55   0.00  0.00      U

改过之后变为

1    N   ALA    35   1.00  1.00      U
4    HT3 ALA    35   0.00  0.00      U
5    CA  ALA    35   1.00  1.00      U
307  N   HSD    55   0.00  1.00      U


请问有什么方法可以做?谢谢了
发表于 2004-3-11 18:07:59 | 显示全部楼层
  1. awk '$2~/^[^H]/{$6="1.00"}{print}' filename
  2. 1 N ALA 35 1.00 1.00 U
  3. 4 HT3 ALA 35 0.00 0.00 U
  4. 5 CA ALA 35 1.00 1.00 U
  5. 307 N HSD 55 0.00 1.00 U
复制代码
发表于 2004-3-11 18:11:19 | 显示全部楼层
awk 最适合做这种事情了 :p
 楼主| 发表于 2004-3-11 19:15:10 | 显示全部楼层
噢,原来用awk这么简单

那我想再问一下,如果不知道是第几个域呢?比如想上面的例子,
凡是不包含“数字”加上一个或两个“空格”再加上”H“的行就将“0.00  U”改成“1.00  U”

呵呵,我原来试图用sed做的,但是查了半天资料都没有成功
发表于 2004-3-11 19:17:32 | 显示全部楼层
最初由 scopio 发表
噢,原来用awk这么简单

那我想再问一下,如果不知道是第几个域呢?比如想上面的例子,
凡是不包含“数字”加上一个或两个“空格”再加上”H“的行就将“0.00  U”改成“1.00  U”

呵呵,我原来试图用sed做的,但是查了半天资料都没有成功

贴出"效果图"来~~ ;)
 楼主| 发表于 2004-3-11 19:36:10 | 显示全部楼层
什么效果图阿?

实例的话就是上面的例子,但是不考虑域,其实我是没有用sed做成功,想知道sed来做的话怎么搞。

上面的例子中,除域之外,我发现一个规律就是,凡是我不想更改的行,都有这样的特点:
数字+空格(1个或者2个)+H

象下面

  1. 1  N ALA 35 1.00 0.00 U
  2. 4  HT3 ALA 35 0.00 0.00 U
  3. 5  CA ALA 35 1.00 0.00 U
  4. 307  N HSD 55 0.00 0.00 U
  5. 400 HTG1 ALA 35 0.00 0.00 U
复制代码


谢谢
发表于 2004-3-11 19:44:35 | 显示全部楼层
需要找到第二个域不是以H开头的行,把这行的倒数第二个域的0.00改成1.00,
  1. /home/javalee:cat file
  2. 1 N ALA 35 1.00 0.00 U
  3. 4 HT3 ALA 35 0.00 0.00 U
  4. 5 CA ALA 35 1.00 0.00 U
  5. 307 N HSD 55 0.00 0.00 U
  6. 400 HTG1 ALA 35 0.00 0.00 U
  7. 37 N HSD 55 0.00 0.00 U
  8. /home/javalee:awk '$2!~/^H/{$(NF-1)="1.00"}{print}' file
  9. 1 N ALA 35 1.00 1.00 U
  10. 4 HT3 ALA 35 0.00 0.00 U
  11. 5 CA ALA 35 1.00 1.00 U
  12. 307 N HSD 55 0.00 1.00 U
  13. 400 HTG1 ALA 35 0.00 0.00 U
  14. 37 N HSD 55 0.00 1.00 U
复制代码
我想用sed,可是实在弄不出来,:sorry
 楼主| 发表于 2004-3-11 20:06:35 | 显示全部楼层
哦,sed 反向匹配这么难阿

不管怎么样,你帮我大忙了,真的很谢谢:)
发表于 2004-3-11 20:51:27 | 显示全部楼层
头晕:confused:
发表于 2004-3-12 01:44:42 | 显示全部楼层
最初由 scopio 发表
哦,sed 反向匹配这么难阿

不管怎么样,你帮我大忙了,真的很谢谢:)

如果格式固定的话,那么用sed也可以,虽然很晕~~~ :p 正像home兄所言 ;)
  1. sed 's/\(^[0-9]\{1,\} [^H][A-Z]* [A-Z]* [0-9]\{1,\} [0-9].[0-9]\{1,\}\) *.* \(U\)/\1 1.00 \2/g' file
复制代码
result:
1 N ALA 35 1.00 1.00 U
4 HT3 ALA 35 0.00 0.00 U
5 CA ALA 35 1.00 1.00 U
307 N HSD 55 0.00 1.00 U
400 HTG1 ALA 35 0.00 0.00 U
37 N HSD 55 0.00 1.00 U
本人水平有限,已经尽力了~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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