尝试 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
我正在为一些我确信不应该太棘手的事情而苦苦挣扎。 我有几个包含以下内容的文件:例如
文件 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