2012-09-12 31 views
2

输入文件1比较两个文件中的列(未排序文件)

A1 123 AA 
B1 123 BB 
C2 44 CC1 
D1 12 DD1 
E1 11 EE1 

输入文件2

A sad21 1 
DD1 124f2 2 
CC 123tges 3 
BB 124sdf 4 
AA 1asrf 5 

输出文件

A1 123 AA 1asrf 5 
B1 123 BB 124sdf 4 
D1 12 DD1 124f2 2 

制作输出文件的

我们检查输入文件2.

的输入文件1的第三列和第一山口如果它们匹配,我们打印的输出文件。

注:

这些文件没有排序

我想:

join -t, A B | awk -F "\t" 'BEGIN{OFS="\t"} {if ($3==$4) print $1,$2,$3,$4,$6}' 

但这不列入工作的文件是未排序的。所以条件($ 3 == $ 4)不会一直工作。请帮忙 。

回答

1
perl -F'/\t/' -anle 'BEGIN{$f=1}if($f==1){$H{$F[2]}=$_;$f++ if eof}else{$l=$H{$F[0]};print join("\t",$l,@F[1..$#F]) if defined$l}' f1.txt f2.txt 

或更短

perl -F'/\t/' -anle'$f?($l=$H{$F[0]})&&print(join"\t",$l,@F[1..$#F]):($H{$F[2]}=$_);eof&&$f++' f1.txt f2.txt 
1

一个使用awk方式:

awk 'BEGIN { FS=OFS="\t" } FNR==NR { array[$1]=$2 OFS $3; next } { if ($3 in array) print $0, array[$3] }' file2.txt file1.txt 

结果:

A1 123 AA 1asrf 5 
B1 123 BB 124sdf 4 
D1 12 DD1 124f2 2 
+0

不工作...让我再检查一遍 !! – Debaditya

+0

@编年史:我已经测试过了。这对我来说可以。你的文件是以制表符分隔的吗?你有错误信息吗? – Steve

+0

这两个文件都是制表符分隔....但是当我执行我没有得到任何错误和输出以及.. – Debaditya

2

可以使用join,但你必须先解决的关键领域,并告诉join,在第一个文件,关键是第3列(-1 3):

join -1 3 <(sort -k 3,3 file1) <(sort file2) 

,会得到正确的字段,输出(带column -t格式化输出):

AA A1 123 1asrf 5 
BB B1 123 124sdf 4 
DD1 D1 12 124f2 2 

要获得在这个问题中列出的同一列排序,你需要指定输出格式:

join -1 3 -o 1.1,1.2,1.3,2.2,2.3 <(sort -k 3,3 file1) <(sort file2) 

即文件1字段1到3,然后是文件2字段2和3。输出(带有column -t再次):

A1 123 AA 1asrf 5 
B1 123 BB 124sdf 4 
D1 12 DD1 124f2 2 
2
nawk 'FNR==NR{a[$3]=$0;next}{if($1 in a){p=$1;$1="";print a[p],$0}}' file1 file2 

如下测试:

> cat file1 
A1  123  AA 
B1  123  BB 
C2  44  CC1 
D1  12  DD1 
E1  11  EE1 
> cat file2 
A  sad21 1 
DD1  124f2 2 
CC  123tges 3 
BB  124sdf 4 
AA  1asrf 5 
> awk 'FNR==NR{a[$3]=$0;next}{if($1 in a){p=$1;$1="";print a[p],$0}}' file1 file2 
D1  12  DD1 124f2 2 
B1  123  BB 124sdf 4 
A1  123  AA 1asrf 5 
> 
1

这可能会为你工作(GNU SED):

sed 's|\(\S*\)\(.*\)|/\\s\1$/s/$/\2/p|' file2 | sed -nf - file1