Dad*_*ang 40 awk text-processing join bioinformatics
我有 file1 喜欢:
0 AFFX-SNP-000541 NA
0 AFFX-SNP-002255 NA
1 rs12103 0.6401
1 rs12103_1247494 0.696
1 rs12142199 0.7672
Run Code Online (Sandbox Code Playgroud)
还有一个文件2:
0 AFFX-SNP-000541 1
0 AFFX-SNP-002255 1
1 rs12103 0.5596
1 rs12103_1247494 0.5581
1 rs12142199 0.4931
Run Code Online (Sandbox Code Playgroud)
并想要一个 file3 ,这样:
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
Run Code Online (Sandbox Code Playgroud)
这意味着将 file2 的第 4 列按第 2 列的名称放入 file1。
ter*_*don 59
这应该这样做:
join -j 2 -o 1.1,1.2,1.3,2.3 file1 file2
Run Code Online (Sandbox Code Playgroud)
重要提示:这假设您的文件是根据 SNP 名称排序的(如您的示例中所示)。如果不是,请先对它们进行排序:
join -j 2 -o 1.1,1.2,1.3,2.3 <(sort -k2 file1) <(sort -k2 file2)
Run Code Online (Sandbox Code Playgroud)
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
Run Code Online (Sandbox Code Playgroud)
info join
):`join' 为每对具有相同连接字段的输入行写入一行到标准输出。
`-1 FIELD'
Join on field FIELD (a positive integer) of file 1.
`-2 FIELD'
Join on field FIELD (a positive integer) of file 2.
`-j FIELD'
Equivalent to `-1 FIELD -2 FIELD'.
`-o FIELD-LIST'
Otherwise, construct each output line according to the format in
FIELD-LIST. Each element in FIELD-LIST is either the single
character `0' or has the form M.N where the file number, M, is `1'
or `2' and N is a positive field number.
Run Code Online (Sandbox Code Playgroud)
因此,上面的命令连接第二个字段上的文件并打印文件 1 的第 1、2 和 3 字段,然后是文件 2 的第 3 字段。
gre*_*eke 18
你可以使用awk
:
$ awk 'NR==FNR {h[$2] = $3; next} {print $1,$2,$3,h[$2]}' file2 file1 > file3
Run Code Online (Sandbox Code Playgroud)
输出:
$ cat file3
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
Run Code Online (Sandbox Code Playgroud)
解释:
遍历file2
(NR==FNR
仅适用于第一个文件参数)。使用柱2作为密钥保存列3中的散列阵列:h[$2] = $3
。然后遍历file1
并输出所有三列$1,$2,$3
,从 hash-array 附加相应的保存列h[$2]
。
如果您不需要任何订购,那么一个简单的解决方案是
paste file{1,2} | awk '{print $1,$2,$3,$6}' > file3
Run Code Online (Sandbox Code Playgroud)
这假定所有行都有三个条目,并且两个文件的第 1 列和第 2 列相同(如您的示例数据中所示)