使用不同的文件替换一个单词 Bash

Posted

技术标签:

【中文标题】使用不同的文件替换一个单词 Bash【英文标题】:Replace a word using different files Bash 【发布时间】:2020-10-01 08:52:03 【问题描述】:

我想编辑我的 1.txt 文件,找到一个单词并将其替换为 2.txt 中的对应单词,并添加文件 2 的其余字符串。

我有兴趣维护我的 1.txt 文件的顺序。

>title1
ID1 .... rest of string im not interested
>title2
ID2 .... rest of string im not interested
>title3
ID3 .... rest of string im not interested
>title....

但我想添加我的文件2的信息

>ID1  text i want to extract
>ID2  text i want to extract
>ID3  text i want to extract
>IDs....

最后我想用这个结构创建一个新文件

>title1
ID1 .... text I want
>title2
ID2 .... text I want
>title3
ID3 .... text I want
>title....

我尝试了几个 sed 命令,但大多数都没有完全替换 ID# 那是在两个文件中。希望它可以在 bash 中完成

感谢您的帮助

尝试失败.. 我的代码是 文件 1 = cog_anotations.txt,文件 2=Real.cog.txt ID= COG05764、COG 015668 等...

sed -e '/COG/r Real.cog.txt' -e 'd' cog_anotations.txt
sed "s/^.*COG.*$/$(cat Real.cog.txt)/" cog_anotations.txt
sed -e '/\$COG\$/r Real.cog.txt'  -e 'd' cog_anotations.txt
grep -F -f cog_anotations.txt Real.cog.txt > newfile.txt
grep -F -f Real.cog.txt cog_anotations.txt > newfile.txt

【问题讨论】:

向我们展示您的失败尝试 【参考方案1】:

文件.awk:

BEGIN  RS=">" 
 
  if (FILENAME == "1.txt") 
    a[$2]=$1; b[$2]=$2; 
   
  else  
      if ($1 == b[$1]) 
        if ($1 !="")  printf(">%s\n%s",a[$1],$0)  
      
  

呼叫:

gawk -f file.awk 1.txt 2.txt

文件的顺序很重要。

结果:

>title1
ID1  text i want to extract
>title2
ID2  text i want to extract
>title3
ID3  text i want to extract

解释:

第一个文件在“>”处被划分为记录,然后创建了两个关联数组。仅对第二个文件执行 else 正文。接下来我们检查第二个文件的字段 1 是否在表 b 中,如果是,则格式化并打印下一行。

【讨论】:

【参考方案2】:

不要写一些嵌套的 grep。 带有查找表的简单的一次性逻辑:

declare -A lookup
while read key txt
do lookup["$key"]="$txt"
done < 2.txt

while read key txt
do echo "$lookup[$key]:-$txt"
done < 1.txt

【讨论】:

以上是关于使用不同的文件替换一个单词 Bash的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash中将空格替换为新行[重复]

正则表达式仅用替换文件中的单词替换单词

用文件的内容替换某些标记(使用 bash 脚本)

Bash exscript替换出现的单词

Bash exscript替换出现的单词

如何在替换从文本文件中读取的单词的程序中解释不同的单词长度?