尝试 paste/join 来自两个文件的字段的奇怪结果

Weird result trying to paste/join fields from two files

我正在为一些我确信不应该太棘手的事情而苦苦挣扎。 我有几个包含以下内容的文件:例如

文件 1

                    Model:  nfb
                    Avg(logl(X)):   -275.030
                    logl(Avg(X)):   -252.172
                    DBar:   550.060
                    Dhat:   504.343
                    pD: 45.717
                    DIC:    595.777

文件2

                    Model:  b
                    Avg(logl(X)):   -273.124
                    logl(Avg(X)):   -251.069
                    DBar:   546.248
                    Dhat:   502.138
                    pD: 44.110
                    DIC:    590.358

两个文件都是用制表符分隔的。我正在尝试合并它们,以便最终得到这样的结果:

                Model:  nfb b
                Avg(logl(X)):   -275.030    -273.124
                logl(Avg(X)):   -252.172    -251.069
                DBar:   550.060 546.248
                Dhat:   504.343 502.138
                pD: 45.717  44.110
                DIC:    595.777 590.358

但是我所有的合并尝试都只是将一个文件中的信息直接复制到另一个文件上,出于某种我无法弄清楚的奇怪原因...所以我以这样的方式结束:

$ paste -d $'\t' dummie1 dummie2

                Model:  Model:  b
                Avg(loglAvg(logl(X)):030-273.124
                logl(Avglogl(Avg(X)):172-251.069
                DBar:   DBar:60 546.248
                Dhat:   Dhat:43 502.138
                pD: pD:717  44.110
                DIC:    DIC:777 590.358

$ awk 'FNR==NR { a[] = ; next } { print [=18=], a[] }' dummie1 dummie2

             nfbl:  b
             -275.030X)):   -273.124
             -252.172X)):   -251.069
             550.060546.248
             504.343502.138
             45.717 44.110
            DIC:    590.358 595.777

当我使用像这样的简单文件时,两组代码都工作正常

1   a   b   c   d
1   a   b   c   d
1   a   b   c   d
1   a   b   c   d
1   a   b   c   d

所以我假设数据文件中存在我没有看到的可疑内容。

您可以使用进程替换从 file2 中获取第二列并将其作为第二个参数提供给 paste 命令,如下所示:

$ paste -d $'\t' file1 <(awk '{print }' file2)
Model:  nfb b
Avg(logl(X)):   -275.030    -273.124
logl(Avg(X)):   -252.172    -251.069
DBar:   550.060 546.248
Dhat:   504.343 502.138
pD: 45.717  44.110
DIC:    595.777 590.358
$

或者您可以只使用 join 命令指定要加入的列(-1 1 -2 1=>表示文件 1 中的第一列和文件 2 中的第一列)

$ join -1 1 -2 1 file1 file2
Model: nfb b
Avg(logl(X)): -275.030 -273.124
logl(Avg(X)): -252.172 -251.069
DBar: 550.060 546.248
Dhat: 504.343 502.138
pD: 45.717 44.110
DIC: 595.777 590.358
$

有这个工具join

$ join file1 file2

Model: nfb b
Avg(logl(X)): -275.030 -273.124
logl(Avg(X)): -252.172 -251.069
DBar: 550.060 546.248
Dhat: 504.343 502.138
pD: 45.717 44.110
DIC: 595.777 590.358

没有其他要求。

用于保留标签

$ join -t $'\t' -j 2 file1 file2

Model:          nfb             b
Avg(logl(X)):           -275.030                -273.124
logl(Avg(X)):           -252.172                -251.069
DBar:           550.060         546.248
Dhat:           504.343         502.138
pD:             45.717          44.110
DIC:            595.777         590.358

关于排序要求的注意事项:一般来说,要找到所有匹配的记录(多对多),需要对文件进行排序。但是,在这种情况下,如果您按顺序匹配键(1-1 匹配),则不需要对文件进行排序。

您不能使用 join,因为它需要对文件进行排序。使用 dos2unix 删除 control-Ms 后,您可以执行以下任一操作:

$ paste file1 file2 | cut -f1,2,4
Model:  nfb     b
Avg(logl(X)):   -275.030        -273.124
logl(Avg(X)):   -252.172        -251.069
DBar:   550.060 546.248
Dhat:   504.343 502.138
pD:     45.717  44.110
DIC:    595.777 590.358

$ awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[NR]=[=10=];next} {print a[FNR], }' file1 file2
Model:  nfb     b
Avg(logl(X)):   -275.030        -273.124
logl(Avg(X)):   -252.172        -251.069
DBar:   550.060 546.248
Dhat:   504.343 502.138
pD:     45.717  44.110
DIC:    595.777 590.358