在 Bash 中使用“Sed”执行 Prime Key 功能

在 Bash 中使用“Sed”执行 Prime Key 功能

我正在使用 bash 并尝试使用 sed 命令来匹配字符串并将其替换为两个文件之间的另一个字符串。

客观的: 通过匹配另一个包含 [sp_* Var_Names] 的文件来替换所有字符串 [sp_*]。请注意: 1. 两个文件中的顺序是同步的,但不连续,因此不能使用粘贴。 2.功能类似于mysql中的primeKey操作。


文件1

+--sp_O00574_
|
+--sp_Q9TV16_
|
|     +--sp_O18983_
|  +--| (52)
|  |  |  +--sp_Q9BDS6_
|  |  +--| (26)
|  |     |  +--sp_O19024_
|  |     +--| (29)
|  |        +--sp_Q9XT45_

文件2

O00574  CXCR6_HUMAN
Q9TV16  CXCR6_PANTR
O18983  CXCR6_CHLAE
Q9BDS6  CXCR6_MACFA
O19024  CXCR6_MACNE
Q9XT45  CXCR6_MACMU

目的:到 sed -ie 's/O00574/CXCR6_HUMAN/g' File1

内联 Bash 脚本:

cat File2 | while read id; do upID=`echo $id | cut -d " " -f1`; upName=`echo $id | cut -d " " -f2`; sed -ie 's/sp_$upID/$upName/g' File1; done

脚本.sh

#/bin/bash

cat File2 | while read id;
do
    upID=`echo $id | cut -d " " -f1`
    upName=`echo $id | cut -d " " -f2`

    sed -ie 's/sp_$upID/$upName/g' File1
done

问题: sed 命令在循环中不起作用。在 File1 中根本没有观察到任何变化。如果我从脚本中回显 sed 命令,然后在终端中运行它,它将按预期工作。我无法弄清楚可能是什么问题。

感谢您提出的宝贵意见和解决方案。

答案1

从索引文件(File2)生成一个 sed 脚本而不是循环,然后针对 File1 运行该脚本。它会快得多:)。

 awk '{ print "s/sp_"$1"/"$2"/g"}' File2.txt > tranform.sed

然后做:

 sed -i -f transform.sed File1.txt 

所以你的整个脚本可能是:

awk '{ print "s/sp_"$1"/"$2"/g"}' File2.txt > transform.sed
sed -f transform.sed File1.txt

## if you want to remove your transformation file
rm transform.sed

相关内容