合并两个 Unix 文件

合并两个 Unix 文件

我有 2 个用竖线分隔的文件,例如 file1 和 file2。其中 file1 有 33 列,file2 可能有 34/35/36 列。所以我们不要考虑我们有多少列。
我想要做的是比较 file1 和 file2 中的值(从第 1 列到第 32 列)。如果所有值都相同,则从 file2 中获取值并附加到 file1 中的所有相同记录。
假设 file2 中的第一条记录在 file1 中有 5 个匹配项,则取值“|84569|21.5|1”并将其附加到 file1 上的所有匹配项(有关预期结果,请参阅 file3)。同样,对于 file2 中的第二条记录,我们在 file1 中有 5 个匹配项,因此取值“|0”并将其附加到 file1 中的所有匹配记录。 file2 中的第三条记录也是如此。有 3 个匹配项,因此取值“|21457879|12.4”并将其附加到 file1 中的所有 3 个匹配行上

如果您正在考虑如何选择从 file2 中获取值以附加到 file1 中,那么我们应该从第 34 列中获取值。虽然起始位置是固定的,但结束位置不是。就像在示例“a”中,我们从第 34/35/36 列中获取值,但对于“b”,我们只有第 34 列。但是,对于“c”,我们在第 34/35 列中获取值。

我不知道如何格式化下面示例中的数据。所以按原样给予。

文件1

a|a1|a2|a3|a4|...|a32|[email protected]
a|a1|a2|a3|a4|...|a32|[email protected]$1553:2015-02-14 
a|a1|a2|a3|a4|...|a32|[email protected]:2015-03-01 
a|a1|a2|a3|a4|...|a32|[email protected]$121:2015-01-31 
a|a1|a2|a3|a4|...|a32|[email protected]$293:2015-02-28 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]:2014:05:24 
c|c1|c2|c3|c4|...|c32|[email protected] 
c|c1|c2|c3|c4|...|c32|$200:2011:12:06 
c|c1|c2|c3|c4|...|c32|[email protected]$214:2001:01:31 

文件2

a|a1|a2|a3|a4|...|a32|[email protected]|84569|21.5|1 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
c|c1|c2|c3|c4|...|c32|[email protected]|21457879|12.4 

预期文件:File3

a|a1|a2|a3|a4|...|a32|[email protected]|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$1553:2015-02-14|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]:2015-03-01|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$121:2015-01-31|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$293:2015-02-28|84569|21.5|1 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]:2014:05:24|0 
c|c1|c2|c3|c4|...|c32|[email protected]|21457879|12.4 
c|c1|c2|c3|c4|...|c32|$200:2011:12:06|21457879|12.4 
c|c1|c2|c3|c4|...|c32|[email protected]$214:2001:01:31|21457879|12.4 

答案1

在此答案中,您需要指定有多少个字段组成“键”。显然在您的真实数据中它是 32,但在您的示例数据中,前 7 个字段是关键:

awk -F'|'  -v nKeys=7 '
    NR==FNR {
        suff = ""
        for (i=nKeys+2; i<=NF; i++) suff = suff FS $i
        NF = nKeys
        suffixes[$0]=suff
        next
    } 
    {
        printf "%s", $0
        NF = nKeys
        print line suffixes[$0]
    }
' file2 file1 

我们可以计算出关键字段的数量:

awk -v nKeys=$(( $(head -1 file1 | tr '|' '\n' | wc -l) - 1 )) ...

但我们也许可以安全地对数字进行硬编码。

相关内容