awk中的值/对更新

时间:2013-10-10 20:33:20

标签: unix sed awk

我有一个包含键/值的基本CSV。前两列是键,第三列是值。

示例文件1:

12389472,1,136-7402
23247984,1,136-7402
23247984,2,136-7402
34578897,1,136-7402

在另一个文件中,我有一个需要在第一个文件中更改其值的键列表。我正在尝试将值更改为136-7425

示例文件2:

23247984,1
23247984,2

以下是我目前正在做的事情:

/usr/xpg4/bin/awk '{FS=",";OFS=","}NR==FNR{a[$1,$2]="136-7425";next}{$3=a[$1,$2]}1' file2 file1 > output

哪个有效,但是对于file2中找不到的密钥,它的值为空。我只想更改file2中的密钥值,并保留未找到密钥的当前值。

有谁可以指出我做错了什么?或者也许有一种更简单的方法来实现这一目标。

谢谢!

2 个答案:

答案 0 :(得分:4)

看起来你只是为第一个文件中不存在的密钥切换第三个字段。试试这个:

awk '{FS=OFS=","}NR==FNR{a[$1,$2]="136-7425";next} ($1,$2) in a{$3=a[$1,$2]} 1' file2 file1 > output

或(见下面的评论):

awk '{FS=OFS=","}NR==FNR{seen[$1,$2]++;next} seen[$1,$2]{$3="136-7425"} 1' file2 file1 > output

仅供参考,一个名为seen[]的数组也同样常用于从输入中删除重复项,例如:

awk '!seen[$0]++' file

答案 1 :(得分:4)

这一行应该适合你:

awk -F, -v OFS="," 'NR==FNR{a[$1,$2]=1;next}a[$1,$2]{$3="136-7425"}7' file2 file1