使用另一个文件中的另一个匹配字符串替换文件中的字符串

使用另一个文件中的另一个匹配字符串替换文件中的字符串

我有一个file1其中倒数第二列是第一列的代码,例如,RV0002有两个代码年代, 和大号

Rv0001 -       hypothetical protein Rv0019c    T       Signal_transduction_mechanisms
Rv0002  -       hypothetical protein Rv0030     S       Function_unknown
Rv0002 pknA    TRANSMEMBRANE SERINE (STPK A)        L       recombination_and_repair

还有一个file2拥有所有独特右心室*在第一列中:

Rv0001  -0.581372258    -0.147459774    0.548735372 1.001137114
Rv0002  -1.555384307    0.386044242 0.046125098 -0.06681665

我想要第三个文件,它与except eachoutput相同file2右心室* 被替换为其代码。例如,在上面的例子中,output将如下所示:

T   -0.581372258    -0.147459774    0.548735372 1.001137114
S   -1.555384307    0.386044242 0.046125098 -0.06681665
L   -1.555384307    0.386044242 0.046125098 -0.06681665

这是我所能得到的最接近的答案,但是它不起作用。

#!/bin/bash
while read p; do

  gene=$( awk '{print $1}' )
  grep "$gene" $2 | while read -r line ; do
    function_code=$( awk '{print $(NF-1)}' )
    new_row=$(echo $line | sed -e 's/$gen/$function_code/g' )
    echo $new_row >> output
  done

done < $1

如果这很重要的话,我的文件大约有 1 万行。

答案1

首先,您file1没有任何特定的分隔符,其次,您有相同的键但具有不同的值,如"Rv0002 S""Rv0002 L"

正如您期望的输出所示,我认为所有行都已排序,您只想将这两个文件合并在一起。

以下是我要做的事情:

sed -r "s/(^Rv[0-9]+\s).*(\s+[A-Z]\s+).*/\1\2/" file1 > list1

它将为我创建一个键列表,例如:

$ cat list1
Rv0001  T       
Rv0002  S       
Rv0002  L  

毕竟,我会加入他们并削减我想要的领域:

$ join list1 file2 | cut -f2- -d' '
T  -0.581372258 -0.147459774 0.548735372 1.001137114
S  -1.555384307 0.386044242 0.046125098 -0.06681665
L  -1.555384307 0.386044242 0.046125098 -0.06681665

相关内容