通过公共列连接两个文件

通过公共列连接两个文件

我有两个文件。第一个是,

a 0.1 c t 0.4
c 0.25 g a 0.1
d 0.567 c c 0.00004
q 0.76 f c 0.05

第二个是,

a hello
c goodbye
d morning
q hungry

我想制作一个如下文件

hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

这个怎么做?

答案1

尝试这个,

由于文件已排序,我们可以直接使用join命令

 join  Second First | cut -f2- -d' '

hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

如果未排序,请使用以下代码:

join  <(sort second) <(sort first) | cut -f2- -d' '
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

答案2

它应该非常简单,awk您可以在其中处理第二个文件以仅使用第一列,然后使用第一个文件来填充它。

awk 'FNR == NR { map[$1] = $2; next } ($1 in map) { $1 = map[$1] }1 ' second first

答案3

另一种join方法是使用 join 的内置功能:

$ join -o 2.2,1.2,1.3,1.4,1.5  <(sort file1) <(sort file2)
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

允许-o您指定输出格式。这里我们告诉join使用文件 2 的第二个字段 ( 2.2),然后使用文件 1 的第一、第二、第三、第四和第五字段 ( 1.2,1.3,1.4,1.5)。

答案4

使用粘贴。

paste <(cut -d ' ' -f2- file2) <(cut -d ' ' -f2- file1)

使用外壳。

while IFS= read -r file2 <&3; do 
  IFS= read -r file1
  printf '%s %s\n' "${file2##* }" "${file1#* }"
done 3<file2 <file1

注意事项

  • 两者都未排序,并且当涉及大文件/数据时 shell 很慢。

  • 粘贴没有缩进,而是直接格式。

相关内容