如何用另一个文件中的值替换一个文件中的值?

时间:2018-10-31 13:56:00

标签: python bash

我有2个制表符分隔的文件,如下所示:

file1.txt

chr1    710000  715000  143
chr1    715000  720000  144
chr1    720000  725000  145
chr1    725000  730000  146
chr1    730000  735000  147
chr1    735000  740000  148
chr1    740000  745000  149
chr1    745000  750000  150
chr1    750000  755000  151
chr1    755000  760000  152
chr1    760000  765000  153

file2.txt

143 143 84
143 144 26
143 152 32
143 153 15
144 152 11

预期输出:

output.txt

chr1    710000  715000  chr1    710000  715000  84
chr1    710000  715000  chr1    715000  720000  26
chr1    710000  715000  chr1    755000  760000  32
chr1    710000  715000  chr1    760000  765000  15
chr1    715000  720000  chr1    755000  760000  11

我想将 file1.txt (第4列)中的唯一数字与 file2.txt 中的数字(第1和第2列)匹配,并替换为 file1.txt 中的值(第1-3列)。 output.txt 应该有7列,最后一列具有 file2.txt 中的相应值(第3列)。

2 个答案:

答案 0 :(得分:1)

如果file1.txt不太大,则可以将其加载到内存中并使用表查找。

$: cat match
#! /bin/env bash

declare -a lookup=()
while read a b c i
do lookup[$i]="$a       $b      $c" # embedded tabs here
done < file1.txt

while read a b v
do printf "%s\t%s\t$v\n" "${lookup[$a]}" "${lookup[$b]}" # use quotes!
done < file2.txt

$: bash match
chr1    710000  715000  chr1    710000  715000  84
chr1    710000  715000  chr1    715000  720000  26
chr1    710000  715000  chr1    755000  760000  32
chr1    710000  715000  chr1    760000  765000  15
chr1    715000  720000  chr1    755000  760000  11

答案 1 :(得分:0)

q command可以将SQL查询应用于表格文本文件。以下命令将产生预期的输出。

novotuplo = tuple(tuple(item) for item in lista)

这很整洁,但是对于大文件来说却不是很快。但是,它可能比纯bash解决方案要快得多。

在Ubuntu上,您可以将q -t 'SELECT a.c1, a.c2, a.c3, b.c1, b.c2, b.c3, c.c3 FROM ./file2.txt c JOIN ./file1.txt a ON a.c4 = c.c1 JOIN ./file1.txt b ON b.c4 = c.c2' q一起安装。