我有一个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