我有两个文件,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 ;
join: file 2 is not in sorted order
join: file 1 is not in sorted order
00850362809;021;0;13 ;
任何想法如何通过awk或加入获得想要的结果?
答案 0 :(得分:1)
使用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
路径,请尝试使用流程替换对数据进行排序:
$ join -t";" -o '0,1.2,1.3,2.2,2.3' <(sort file1) <(sort file2)
00140913111;21 ;;021;0
00451367210;518 ;;041;0
00550362618;16 ;;121;0
00551360550;418 ;;121;0
00850362809;13 ;;021;0
答案 1 :(得分:1)
没有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 ;
答案 2 :(得分:0)
试试这个 -
$ 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 ;
答案 3 :(得分:0)
加入 命令方法:
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 ;