Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3020326
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-11-20 00:39:16

cat a.txt
01 12510101 4001
02 12310001 4002
03 12550101 4003
04 12610001 4004
05 12810001 4005
06 12310001 4006
07 12710001 4007
08 12310001 4008
09 12810101 4009
10 12510101 4010
11 12310001 4011
12 12610001 4012
13 12310001 4013

cat b.txt
A 12410101 2006/02/15 2009/01/31 4002
B 12310001 2006/08/31 2008/08/29 4001
C 12610001 2008/05/23 2008/05/22 4002
D 12810001 1992/12/10 1993/06/30 4001
E 12660001 1992/05/11 1993/06/01 4005

判断 a.txt 文件中第二个字段的内容存在于 b.txt 文件中的第二个字段的话就输出该行,并把 b.txt 文件中的两个日期内容添加在该行后:
02 12310001 4002 2006/08/31 2008/08/29
04 12610001 4004 2008/05/23 2008/05/22
05 12810001 4005 1992/12/10 1993/06/30
06 12310001 4006 2006/08/31 2008/08/29
08 12310001 4008 2006/08/31 2008/08/29
11 12310001 4011 2006/08/31 2008/08/29
12 12610001 4012 2008/05/23 2008/05/22
13 12310001 4013 2006/08/31 2008/08/29




  1. sed -rn '/^[^0-9]/H;/^[0-9]/{G;/(.*)( .*)( .*)\n\n.*\2( [^ ]*)( [^ ]*).*/s//\1\2\3\4\5/p}' b.txt a.txt
[解析]
sed操作两个文件难度很大吧。今天学习到一个新的思路,两个文件的差别还比较明显,就是一个是数字开头,一个是英文开头,先把 b.txt 文本处理全部追加到 hold space 里,因为是英文字母开头的所以很好区分开。然后匹配到数字开头的行,那就是 a.txt 文件了,G 把 hold space 里的内容追加到该行后,然后开始匹配,因为我们要的是第二个字段,所以通过小括号把第二个字段取到,匹配 \n\n 后是否能匹配到 \2 的内容,这里为什么是 \n\n 的写法呢?因为我们之前用的是 H 追加,hold space 里当时是空的,追加去后第一行会是一个空行,所以这里写两个换行符来匹配,如果匹配成功就执行替换,把我们要的标记出的内容替换成一行,然后打印。



  1. awk 'NR==FNR{a[$2]=$3FS$4;next}{if($2 in a)print $0,a[$2]}' b.txt a.txt
[解析]
这里用awk呢就方便很多。但是学习sed的思路。
阅读(3771) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~