我正在努力做一些我确信不应该太棘手的事情。 我有几个包含以下内容的文件:例如
文件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
所以我假设数据文件有些可疑,我没有看到。
答案 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