Chinaunix
标题:
对应列的匹配
[打印本页]
作者:
秋天的絮儿
时间:
2013-02-20 10:00
标题:
对应列的匹配
各位好
关于文本处理内容,小弟遇到难处。如下:
op@MaintRoom[129]:% more a
t 1 2 7
r 1 w p
e q w i
op@MaintRoom[130]:% more b
t 40 30 22
r 20 20 23
op@MaintRoom[131]:%
想得到的结果如下:
t 1 2 7 40 30 22
r 1 w p 20 20 23
e q w i * * *
将a 与b 进行匹配,如果b的第一列和a的第一列相同,则将b除第一列的后面所有列都匹配到a 对应列后面;没有被匹配的行的对应列用*表示。
小弟先谢了!
作者:
yestreenstars
时间:
2013-02-20 10:31
awk 'NR==FNR{a[$1]=$2"\t"$3"\t"$4;next}{if($1 in a)print $0"\t"a[$1];else print $0"\t*\t*\t*"}' b a
复制代码
作者:
秋天的絮儿
时间:
2013-02-20 10:53
回复
2#
yestreenstars
恩
好用的
但是估计到后面就麻烦了,为什么我要用*号表示空格处呢,就是为了后面继续匹配的,第一次匹配完了后,过几天再在上次匹配完了的基础上再匹配的时候就要指令了。是不是啊?
作者:
tank064
时间:
2013-02-20 11:07
又见 星辰大哥啊 哈哈!!! 学习了~!!
yestreenstars 发表于 2013-02-20 10:31
作者:
yestreenstars
时间:
2013-02-20 11:19
回复
3#
秋天的絮儿
老实说,不太明白你的意思~
作者:
yestreenstars
时间:
2013-02-20 11:19
回复
4#
tank064
多谢支持~
作者:
关阴月飞
时间:
2013-02-20 11:21
[root@]# cat a
t 1 2 7
r 1 w p
e q w i
[root@]# cat b
t 40 30 22
r 20 20 23
[root@]# join -e \* -o 0,1.2,1.3,1.4,2.2,2.3,2.4 -a 1 -a 2 <(sort -r a) <(sort -r b)
t 1 2 7 40 30 22
r 1 w p 20 20 23
e q w i * * *
复制代码
作者:
seesea2517
时间:
2013-02-20 11:24
join 只能处理到这里了,* 号还是交给 awk 吧:
[seesea@UC ~]$ join -a 1 a.txt b.txt
t 1 2 7 40 30 22
k x x x
r 1 w p 20 20 23
e q w i
[seesea@UC ~]$ head *.txt
==> a.txt <==
t 1 2 7
k x x x
r 1 w p
e q w i
==> b.txt <==
t 40 30 22
r 20 20 23
复制代码
作者:
blackold
时间:
2013-02-20 11:34
回复
8#
seesea2517
join 也是可以的。
当然,没有awk 灵活。
作者:
seesea2517
时间:
2013-02-20 11:40
回复
9#
blackold
嗯,毕竟awk是一个可编程的工具,join 只有几个小小的选项。
作者:
秋天的絮儿
时间:
2013-02-20 12:58
回复
5#
yestreenstars
恩
我的意思是如果每周都有文件不断的向a文件内叠加的话,红色字体就会变得很长很长,对不对啊?
星辰大哥
awk 'NR==FNR{a[$1]=
$2"\t"$3"\t"$4
;next}{if($1 in a)print $0"\t"a[$1];else print $0"\t*\t*\t*"}' b a
作者:
yestreenstars
时间:
2013-02-20 13:05
回复
11#
秋天的絮儿
是的。
作者:
yestreenstars
时间:
2013-02-20 13:19
回复
11#
秋天的絮儿
可以通过以下方法解决:
awk 'NR==FNR{for(i=2;i<=NF;i++)a[$1]=a[$1]!=""?a[$1]"\t"$i:$i;b=NF-1;next}{if($1 in a)print $0"\t"a[$1];else{for(i=1;i<=b;i++)$0=$0"\t*";print $0}}'
复制代码
作者:
seesea2517
时间:
2013-02-20 14:20
回复
9#
blackold
才看到
@关阴月飞
的回复,原来如此啊,用 -e 的话,没有用 -o 也是没效果的,学习了。
作者:
yestreenstars
时间:
2013-02-20 14:33
本帖最后由 yestreenstars 于 2013-02-20 14:33 编辑
请教一下黑哥,上次看到你的一个回帖,是解决除第一列外,其他全部打印的问题,我当时看了一下,你有用到$1="",后面的忘记了,刚去查你的回帖兼职就是大海捞针,望赐教~
@blackold
作者:
blackold
时间:
2013-02-20 15:10
本帖最后由 blackold 于 2013-02-20 15:12 编辑
回复
15#
yestreenstars
你是说神马?
$1="";$0=$0;$1=$1
复制代码
中午和一个妹仔聊得热乎……
作者:
yestreenstars
时间:
2013-02-20 15:12
回复
16#
blackold
对~就是这个,刚才在群里也问到了~
作者:
blackold
时间:
2013-02-20 15:13
回复
17#
yestreenstars
原来是牛群啊。
作者:
yestreenstars
时间:
2013-02-20 15:14
回复
18#
blackold
不知道黑哥是否也在其内~
作者:
blackold
时间:
2013-02-20 15:21
回复
19#
yestreenstars
不在吧,我都用blackold或黑哥。
作者:
yestreenstars
时间:
2013-02-20 15:23
回复
16#
blackold
哇,原来黑哥中午把妹去了~
作者:
blackold
时间:
2013-02-20 16:20
回复
14#
seesea2517
我原以为你已经懂了,所以当时没跟你说。
作者:
seesea2517
时间:
2013-02-20 17:15
回复
22#
blackold
原来如此,我以为你卖个关子。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2