我有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列)。
答案 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
一起安装。