Linux 基于列中的公共值合并两个文件

Linux 基于列中的公共值合并两个文件,linux,shell,join,awk,Linux,Shell,Join,Awk,我有两个文件,file1和file2 文件1: 00451367210;518 ; 00140913111;21 ; 00551360550;418 ; 00550362618;16 ; 00850362809;13 ; 文件2 00451367210;041;0 00140913111;021;0 00010010136;021;0 00210010157;041;1. 00550362618;121;0 0085036280

我有两个文件,
file1
file2

文件1:

00451367210;518       ;
00140913111;21        ;
00551360550;418       ;
00550362618;16        ;
00850362809;13        ;
文件2

00451367210;041;0
00140913111;021;0
00010010136;021;0
00210010157;041;1.
00550362618;121;0
00850362809;021;0
00010010337;021;0
00551360551;021;0
00551360550;121;0
我想根据文件1和文件2中列1的公共值组合两个文件的列

结果如下所示:

00451367210;041;0;518       ;
00140913111;021;0;21        ;
00551360550;121;0;418       ;
00550362618;121;0;16        ;
00850362809;021;0;13        ;
我试过这个:

join -t";"  -o '0,1.2,1.3,2.2,2.3' File1 File2
但我有一个:

00451367210;041;0;518       ;
00140913111;021;0;21        ;
联接:文件2未按排序顺序排列
联接:文件1未按排序顺序排列
00850362809;021;0;13        ;
知道如何通过awk或join获得想要的结果吗

将awk用于作业:

$ awk 'BEGIN{FS=OFS=";"}NR==FNR{a[$1]=$0;next}($1 in a)&&$1=a[$1]' file2 file1
00451367210;041;0;518       ;
00140913111;021;0;21        ;
00551360550;121;0;418       ;
00550362618;121;0;16        ;
00850362809;021;0;13        ;
解释:

  BEGIN { FS=OFS=";" }      # set delimiters 
NR==FNR { a[$1]=$0; next }  # hash file 2 on first field to a 
($1 in a) && $1=a[$1]       # if file1 record is found in a output it
如果要探索
加入路径,请尝试使用进程替换对数据进行排序:

$join-t”;“-o'0,1.2,1.3,2.2,2.3'试试这个-

$ awk -F';' 'NR==FNR{a[$1]=$2;next} $1 in a {print $0 FS a[$1] OFS FS}' f1 f2
00451367210;041;0;518        ;
00140913111;021;0;21         ;
00550362618;121;0;16         ;
00850362809;021;0;13         ;
00551360550;121;0;418        ;

在没有
awk
的情况下,如果您想保留顺序,
join
可能会更改,下面是一种方法

f() { nl -s';' $1 | sort -t';' -k2;}; 
join -t';' -j2 <(f file1) <(f file2) -o1.2,2.3,1.3,1.1 | 
sort -t';' -k4n | 
sed -r 's/[ 0-9]+$//'


00451367210;041;518       ;
00140913111;021;21        ;
00551360550;121;418       ;
00550362618;121;16        ;
00850362809;021;13        ;
f();
加入-t';'-j2加入命令方法:

join -t';' -j1 -o'1.1,2.2,2.3,1.2,1.3'  <(sort /tmp/file1) <(sort /tmp/file2)
join -t';' -j1 -o'1.1,2.2,2.3,1.2,1.3'  <(sort /tmp/file1) <(sort /tmp/file2)
00140913111;021;0;21        ;
00451367210;041;0;518       ;
00550362618;121;0;16        ;
00551360550;121;0;418       ;
00850362809;021;0;13        ;