加入两个都有重复行的文件

Joining two files that both have duplicate rows

我正在尝试连接两个具有相同列 1 和不同列 2 的文件:

文件 1

    aaa 1
    bbb 3
    bbb 3
    ccc 1
    ccc 1
    ccc 0

文件 2

    aaa 2
    bbb 2
    bbb 2
    ccc 1
    ccc 1
    ccc 0

当我尝试加入他们时

    join File1 File2 > File3

我明白了

    aaa 1 2
    bbb 3 2
    bbb 3 2
    bbb 3 2
    bbb 3 2
    ccc 1 1
    ccc 1 1
    ccc 1 0
    ccc 1 1
    ccc 1 1
    ccc 1 0
    ccc 0 1
    ccc 0 1
    ccc 0 0

join 正在尝试扩展重复项,而我想要它做的只是逐行进行,因此输出应该是

    aaa 1 2
    bbb 3 2
    bbb 3 2
    ccc 1 1
    ccc 1 1
    ccc 0 0

如何告诉 join 忽略重复项并逐行合并文件?

编辑:这是在一个循环中完成的,多个文件都具有相同的第 1 列但不同的第 2 列。我将前两个文件连接到一个临时文件中,然后循环遍历与该文件连接的其他文件临时文件。

根据@Andre Wildberg 的建议,这个效果最好:

    paste File1 <(cut -d " " -f 2 File2)

这允许循环遍历文件列表:

    cat File1 > tmp

    for file in $files
    do
        paste tmp <(cut -d " " -f 2 $file) > tmpf
        mv tmpf tmp
    done

    mv tmp FinalFile

假设:

  • 所有文件的行数相同
  • 所有文件在同一编号行的第一列中具有相同的值
  • 最终结果集可以放入内存

示例输入:

$ for f in f{1..4}
do
    echo "############ $f"
    cat $f
done

############ f1
aaa 1
bbb 3
bbb 3
ccc 1
ccc 1
ccc 0

############ f2
aaa 2
bbb 2
bbb 2
ccc 1
ccc 1
ccc 0

############ f3
aaa 12
bbb 12
bbb 12
ccc 11
ccc 11
ccc 10

############ f4
aaa 202
bbb 202
bbb 202
ccc 201
ccc 201
ccc 200

一个awk想法:

awk '
FNR==NR { a[FNR]=[=11=]; next }
        { a[FNR]=a[FNR] OFS  }
END     { for (i=1;i<=FNR;i++) 
              print a[i]
        }
' f1 f2 f3 f4

这会生成:

aaa 1 2 12 202
bbb 3 2 12 202
bbb 3 2 12 202
ccc 1 1 11 201
ccc 1 1 11 201
ccc 0 0 10 200