Unix中的模式匹配

时间:2012-07-12 06:20:29

标签: perl bash unix

第一档

D07        AAS@qqq
B82        GG^333
D84        GG@WW
F59        LL$$EE

第二档

D84        /usr/ss
F59        /usr/jh
B82        /usr/kk
D07        /usr/ks

输出应为

D84     GG@WW       /usr/ss
F59     LL$$EE    /usr/jh
B82     GG^333      /usr/kk
D07     AAS@qqq     /usr/ks

基本上,我想将第一个文件的数据排序为w.r.t到第二个文件

我尝试过:

BEGIN {
   FS = OFS = "\t";
}
NR==FNR {
   Values[$1+0] = $2;
   next;
}
{
   $1 = $1 OFS ($1+0 in Values ? Values[$1+0] : "");
   print $0;
}
' 1stfile 2ndfile 

任何人都可以提供任何简单的解决方案来实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

如果您愿意对文件进行排序然后使用bash join

,则不需要perl
$ ll
file1
file2
$ cat file1
D07        AAS@qqq
D82        GG^333
D84        GG@WW
D59        LL$$EE
$ cat file2
D84        /usr/ss
D59        /usr/jh
D82        /usr/kk
D07        /usr/ks
$ sort -n file1 > file1a
$ sort -n file2 > file2a
$ cat file1a
D07        AAS@qqq
D59        LL$$EE
D82        GG^333
D84        GG@WW
$ cat file2a
D07        /usr/ks
D59        /usr/jh
D82        /usr/kk
D84        /usr/ss
$ join file1a file2a > file3
$ cat file3
D07 AAS@qqq /usr/ks
D59 LL$$EE /usr/jh
D82 GG^333 /usr/kk
D84 GG@WW /usr/ss

答案 1 :(得分:0)

with perl:

perl -nle '/(.*?)\s+(.*)/&&($h{$1}[$t]=$2);eof&&$t++;END{while(($k,$v)=each%h){print"$k @{$v}"}}' 1stfile 2ndfile