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

输出文件的制作

我们检查输入文件 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) 不会一直有效。请帮忙 。

4

5 回答 5

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
于 2012-09-12T08:40:06.167 回答
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
>
于 2012-09-12T08:57:50.910 回答
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
于 2012-09-12T06:15:07.167 回答
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
于 2012-09-12T07:53:12.097 回答
1

这可能对您有用(GNU sed):

sed 's|\(\S*\)\(.*\)|/\\s\1$/s/$/\2/p|' file2 | sed -nf - file1
于 2012-09-12T10:06:06.297 回答