我有两个文件。第一个是,
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 很慢。
粘贴没有缩进,而是直接格式。