尝试从两个文件粘贴/连接字段的奇怪结果

时间:2016-04-05 23:39:08

标签: bash join awk paste

我正在努力做一些我确信不应该太棘手的事情。 我有几个包含以下内容的文件:例如

文件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

file2的

                    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[$1] = $2; next } { print $0, a[$1] }' 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

所以我假设数据文件有些可疑,我没有看到。

3 个答案:

答案 0 :(得分:1)

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

$ paste -d $'\t' file1 <(awk '{print $2}' 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 =&gt;表示file1中的第1列和file2中的第1列)

$ 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
$

答案 1 :(得分:1)

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匹配),则不需要对文件进行排序。

答案 2 :(得分:1)

您无法使用join,因为它需要对文件进行排序。使用dos2unix删除控件-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]=$0;next} {print a[FNR], $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