我正在使用 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