bash 脚本中的 awk 命令将我的文件字段分隔符从“:”替换为“”

awk command in bash script replaced my file field separator from ":" to " "

这是我的 BookDB.txt 文件的样子:

Red:Blue:12:197:101

我在提示符中输入了这个命令:

awk -F: '=="Red"{="Black"}1' BookDB.txt >> tmp && mv tmp BookDB.txt

这是对我的文件所做的更改:

Red Black 12 197 101

问题是我希望命令将字段分隔符保留为“:”,但命令将字段分隔符更改为白色 space。我想更改的唯一字段是名为 "Blue" 到 "Black" 的第二个字段。有什么方法可以让我将分隔符保留为“:”吗?

这是我想要的结果:

Red:Black:12:197:101

编辑:

read -p "Title of the old book: " title
read -p "Title of the book you want to update: " title_Update

awk -F: -vOFS=":" '=="$title"{="$title_Update"}1' BookDB.txt

使用 OFS:

awk -F":" '=="Red"{="Black"}1'  OFS=":" file

您需要使用 OFS(输出字段分隔符)预定义的 AWK 变量。此变量的初始值为 " ",这就是为什么您在输出之间得到 space 的原因。请参阅以下使用 OFS 变量的不同方法。

[root@saltmaster test]# awk -F: 'BEGIN{OFS=":"}=="Red"{="Black"}1' input.txt
Red:Black:12:197:101
[root@saltmaster test]# awk -v FS=":" -v OFS=":" '=="Red"{="Black"}1' input.txt
Red:Black:12:197:101
[root@saltmaster test]# awk 'BEGIN{FS=":"; OFS=":"}=="Red"{="Black"}1' input.txt
Red:Black:12:197:101
[root@saltmaster test]# awk -F":" '=="Red"{="Black"}1'  OFS=":" input.txt
Red:Black:12:197:101

当您为字段赋值时,您是在告诉 awk 使用当前 OFS 值重新编译当前记录,以替换读取记录时使用的 FS 值。你想要:

awk -v old="$title" -v new="$title_update" 'BEGIN{FS=OFS=":"} ==old{=new} 1'

上述设置 FS 和 OFS 的方法是正确方法的原因是,当初始化 2 个变量时必须设置为相同的 hard-coded 值,为了清楚和将来的可维护性,最好将它们初始化在同时初始化为该值,而不是在完全独立的代码部分中将它们独立初始化为相同的值。

在脚本开始时初始化变量也更有意义,即在使用它们之前,而不是在脚本结束时使用它们之后。