输入文件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)不会一直有效。请帮忙。
答案 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