bash追加两个与索引匹配的文件的内容

时间:2019-10-02 07:53:03

标签: bash awk

我有两个文件,file1

    a
    b
    c
    d
    e
    f
    g
    h
    i
    j

和file2

    b
    c zzz uuu
    d qqq lll
    a xxx ggg
    f
    b
    g
    e rrr ppp

如果数字匹配,我想将file2的内容附加到file1上,但是,我也想打印出file1的不匹配行而不更改顺序。 因此,理想的效果是

    a xxx ggg
    b
    c zzz uuu
    d qqq lll
    e rrr ppp
    f
    g
    h
    i
    j

匹配列也可以重复,这不是问题,所以也可以

    a a xxx ggg
    b b
    c c zzz uuu
    d d qqq lll
    e e rrr ppp
    f f
    g g
    h h
    i i
    j j

我尝试过

    awk 'FNR==NR{a[$1]=$0;next} ($1 in a) {print a[$1],$0}' a b

但结果是

    b b
    c c zzz uuu
    d d qqq lll
    a a xxx ggg
    f f
    b b
    g g
    e e rrr ppp

所以顺序丢失了,文件1中缺少行,有什么建议吗?

4 个答案:

答案 0 :(得分:2)

能否请您尝试以下。

awk 'FNR==NR{val=$1;$1="";sub(/^ +/,"");a[val]=$0;next} {print $0,a[$1]}' Input_file2 Input_file1

说明:

此处FNR==NR处的检查条件表示,如果FNR等于NR的值,则执行以下操作。当读取第一个Inpit_file2时,此条件成立。

现在创建一个名为val的变量,其值是第一个字段,然后使第一个字段无效,并用NULL代替初始空间。

现在创建一个名为的数组,其索引是变量val,值是当前行。

使用next将跳过此处的所有其他声明。

现在打印第一个字段,然后在不存在该值的情况下打印一个[$ 1]值,它将留空。

答案 1 :(得分:1)

请尝试:

awk 'FNR==NR{a=$1;$1="";b[a]=$0;next} {print $1, b[$1]}' file2 file1

结果:

a  xxx ggg
b
c  zzz uuu
d  qqq lll
e  rrr ppp
f
g
h
i
j

答案 2 :(得分:1)

假设真实文件1的排序方式如您的示例所示:

$ join -j1 -o 0,2.2,2.3 -a1 file1.txt <(sort -u file2.txt)    
a xxx ggg
b  
c zzz uuu
d qqq lll
e rrr ppp
f  
g  
h  
i  
j  

答案 3 :(得分:0)

另一种方式:

awk 'FNR==NR{b[$1]=$0;next} {print $0,b[$1]}' b a