比较两个文件列(未排序的文件)

时间:2012-09-12 06:06:25

标签: bash unix sed awk

输入文件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

制作输出文件

我们检查输入文件1的第3列和输入文件2的第1列。

如果匹配,我们将其打印在输出文件中。

注意:

文件未排序

我试过了:

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

但是这不起作用,因为文件未分类。所以条件($ 3 == $ 4)不会一直有效。请帮忙。

5 个答案:

答案 0 :(得分:2)

可以使用join,但您需要先对关键字段进行排序,然后告诉join第一个文件中的密钥是第3列({{1} }}):

-1 3

将为您输出正确的字段,输出(column -t用于输出格式化):

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

要获得问题中列出的相同列排序,您需要指定输出格式:

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

即。文件1字段1到3然后文件2字段2和3.输出(再次使用column -t):

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

答案 1 :(得分: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
>

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:1)

这可能适合你(GNU sed):

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