使用 SED 或 AWK 将一个文件中的值替换到另一个文件中

使用 SED 或 AWK 将一个文件中的值替换到另一个文件中

有人可以帮助我解决我想要解决的问题吗?我目前正在使用 2 个文件。一个文件的内容位于一个列表中,该列表有 2 列,其值如下。

文件_A.txt:

1 MSFT
2 YHOO
3 GOOG
4 APPL
5 SUN

文件_B.txt:

### Client A ###
1
2
3

### Client B ###
2
3
4
5

++++

我试图使用任何替换方法来实现,对于每次出现的 1,将文件 B 中的值更改为 MFST。对于文件 B 中每次出现的 2,将该值更改为 YHOO,将 3 更改为 GOOG,依此类推。

目前我能做到这一点的唯一方法是使用交互式 sed 进行手动且漫长的过程。有没有我可以使用的循环语法?

sed -i 's/\1\>/MSFT/g' FILE_B.txt

非常感谢

答案1

像那样?

awk 'NR==FNR{a[$1]=$2} NR!=FNR{if($1 in a){$1=a[$1]};print}' File_A.txt FILE_B.txt
### Client A ###
MSFT
YHOO
GOOG

### Client B ###
YHOO
GOOG
APPL
SUN

如果这对您有用,请将输出重定向到 tmp 文件,然后通过 FILE_B.txt mv tmp 文件...如果sponge已安装,您可以

awk 'NR==FNR{a[$1]=$2} NR!=FNR{if($1 in a){$1=a[$1]};print}' File_A.txt FILE_B.txt | sponge FILE_B.txt

答案2

A真的很可怕sed解决方案:

  1. 使用sed将FILE_A转换为sed命令
  2. 将该代码应用于 FILE_B
sed "$(sed 's/^/s!^/;s/ /$!/;s/$/!/' FILE_A.txt)" FILE_B.txt

答案3

作为一个纯粹主义者,我更喜欢使用单个 的解决方案sed,尽管有些人也可能认为这不可读:

sed '/^[0-9]* /{H;d;};G;s/^\([0-9]*\)\n.*\n\1 \([A-Z]*\).*/\2/;P;d' FILE_A.txt FILE_B.txt

我相信没有人愿意对此做出解释。

相关内容