cat a.txt01 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
- 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 里当时是空的,追加去后第一行会是一个空行,所以这里写两个换行符来匹配,如果匹配成功就执行替换,把我们要的标记出的内容替换成一行,然后打印。
- awk 'NR==FNR{a[$2]=$3FS$4;next}{if($2 in a)print $0,a[$2]}' b.txt a.txt
[解析]
这里用awk呢就方便很多。但是学习sed的思路。
阅读(3789) | 评论(0) | 转发(2) |