Bash 如何以列为键合并两个文件
如何以列为键合并两个文件,从a.txt匹配到$1列,并根据$3列追加b.txtBash 如何以列为键合并两个文件,bash,shell,awk,sed,Bash,Shell,Awk,Sed,如何以列为键合并两个文件,从a.txt匹配到$1列,并根据$3列追加b.txt a.txt aa; 2.5; 0.001; ab; 1.5; 0.003; ac; 0.4; 0.002; b.txt 20-Nov-2014; 1775.00; aa; 20-Nov-2014; 1775.00; aa; 20-Nov-2014; 1463.40; ab; 20-Nov-2014; 1463.40; ac; 20-Nov-2014; 1463.40; ab; Desired output lo
a.txt
aa; 2.5; 0.001;
ab; 1.5; 0.003;
ac; 0.4; 0.002;
b.txt
20-Nov-2014; 1775.00; aa;
20-Nov-2014; 1775.00; aa;
20-Nov-2014; 1463.40; ab;
20-Nov-2014; 1463.40; ac;
20-Nov-2014; 1463.40; ab;
Desired output look like this
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
20-Nov-2014; 1463.40; ac; ac; 0.4; 0.002;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
Thanks
工作原理
awk
隐式循环文件中的每一行。每行被划分为多个字段
-F';'代码> 这告诉
使用分号作为字段分隔符awk
NR是到目前为止已读入的行数,FNR是到目前为止从当前文件读入的行数。因此,当FNR==NR{a[$1]=0;next;}
时,我们仍在读取第一个文件FNR==NR
。在这种情况下,该集合将刚刚读入的整行(a.txt
)分配给第三个字段$0
下的数组$1
a
告诉next
跳过下面的其余命令,跳到下一行重新开始awk
如果我们到了这里,这意味着我们正在处理第二个文件打印$0''a[substr($3,2)]
。在这种情况下,打印此文件的每一行,后跟arrayb.txt
中与第三个字段匹配的行 在文件a
中,第三个字段以空格开头。在数组b.txt
中查找此字段时,将使用a
函数删除该空格substr
$ awk -F'; ?' 'NR==FNR{a[$1]=$0;next} {print $0, a[$3]}' a.txt b.txt
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
20-Nov-2014; 1463.40; ac; ac; 0.4; 0.002;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
$ awk -F';' 'FNR==NR{a[$1]=$0;next;} {print $0" " a[substr($3,2)];}' a.txt b.txt
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
20-Nov-2014; 1463.40; ac; ac; 0.4; 0.002;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
awk -F\; 'NR==FNR{arr[" "$1]=$0;next} {print $0, arr[$3]}' a b
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
20-Nov-2014; 1463.40; ac; ac; 0.4; 0.002;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;