Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何以列为键合并两个文件_Bash_Shell_Awk_Sed - Fatal编程技术网

Bash 如何以列为键合并两个文件

Bash 如何以列为键合并两个文件,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匹配到$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 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
    使用分号作为字段分隔符

  • FNR==NR{a[$1]=0;next;}

    NR是到目前为止已读入的行数,FNR是到目前为止从当前文件读入的行数。因此,当
    FNR==NR
    时,我们仍在读取第一个文件
    a.txt
    。在这种情况下,该集合将刚刚读入的整行(
    $0
    )分配给第三个字段
    $1
    下的数组
    a

    next
    告诉
    awk
    跳过下面的其余命令,跳到下一行重新开始

  • 打印$0''a[substr($3,2)]

    如果我们到了这里,这意味着我们正在处理第二个文件
    b.txt
    。在这种情况下,打印此文件的每一行,后跟array
    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;