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 ;