不要用bash中的awk覆盖具有相似名称的其他列

时间:2015-07-29 11:53:48

标签: bash awk

有时我需要覆盖文件中的某些值。

例如,我的表是:

Name;Town;ID
Michal;Vienna;123456
Yasmin;Krakow;12345 
Sarlote;Prague;1234
Karol;Budapest;12348

我需要将Sarlote ID从1234更改为4321。 我使用了以下awk命令:

awk -v h="1234" -v new_value="4321" 'BEGIN {FS = ";"} $1 ~ h $3=new_value}1' OFS=';' file >> file1 && mv file1 file

但输出是:

Name;Town;ID
Michal;Vienna;4321
Yasmin;Krakow;4321
Sarlote;Prague;4321
Karol;Budapest;4321

但我想只更改Sarlote ID。

1 个答案:

答案 0 :(得分:0)

看起来你只需要:

$ awk -v name="Sarlote" -v newId=4321 'BEGIN{FS=OFS=";"} $1==name{$3=newId} 1' file
Name;Town;ID
Michal;Vienna;123456
Yasmin;Krakow;12345
Sarlote;Prague;4321
Karol;Budapest;12348

但如果您确实需要测试旧ID,那么您只需添加该变量和条件:

$ awk -v name="Sarlote" -v oldId=1234 -v newId=4321 'BEGIN{FS=OFS=";"} ($1==name) && ($3==oldId) {$3=newId} 1' file
Name;Town;ID
Michal;Vienna;123456
Yasmin;Krakow;12345
Sarlote;Prague;4321
Karol;Budapest;12348