sed之两个文件共有特征行的合并输出

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

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]= 3FS4;next}{if(2 in a)print 0,a[ 2]}’ b.txt a.txt
[解析]
这里用awk呢就方便很多。但是学习sed的思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值