cat a
1010 a
2000 a
1020 b
1030 c
1080 c
1090 x
cat b
1000 a
1001 e
1090 x
1002 f
1200 c
如果两个文本中有相同的行,就不输出,按第二个字段共同特征的行就合并一起。
1000 a 1010 a 2000 a
1020 b
1030 c 1080 c 1200 c
1001 e
1002 f
- sort -k2 a b|sed ':a;N;/^\(.*\)\n\1$/d;s/\( .*\)\n\(.*\)\1$/\1 \2\1/;ta;P;D'
[解析]
肯定对这2个文件先排序吧,如果匹配到两行是一模一样的就 d 删除掉。然后继续执行替换,这时候肯定不是一模一样的情况了,去替换匹配第二列的特征是否一致,如果成功就替换掉了 \n ,然后 ta 跳转去命令行首,读取下一行,判断是否一样(肯定不会一样了),接着继续替换,当读取的下一行不匹配标签了,那么替换不会成功,ta 不会生效,就 P;D ,打印第一行,然后删除,并跳转去行首继续执行。直到 N 无下一行读取中止命令。
- awk '$0 in c{delete b[$2];next}{a[$2]=a[$2]?a[$2]" "$0:$0;b[$2]=$2;c[$0]}END{for(i=0;i++<asort(b);)print a[b[i]]}' a b
[解析]
用三个数组来实现,数组a来保存内容,数组b来实现排序,数组c来实现判断是否一样的行。
阅读(3803) | 评论(0) | 转发(1) |