Unix awk中的值/对更新

Unix awk中的值/对更新,unix,sed,awk,Unix,Sed,Awk,我有一个包含键/值的基本CSV。前两列是键,第三列是值 示例文件1: 12389472,1,136-7402 23247984,1,136-7402 23247984,2,136-7402 34578897,1,136-7402 23247984,1 23247984,2 在另一个文件中,我有一个需要在第一个文件中更改其值的键列表。我正在尝试将值更改为136-7425 示例文件2: 12389472,1,136-7402 23247984,1,136-7402 23247984,2,136-

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

示例文件1:

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

示例文件2:

12389472,1,136-7402
23247984,1,136-7402
23247984,2,136-7402
34578897,1,136-7402
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
它正在工作,但它将
文件2中未找到的键的值留空。我只想更改
file2
中存在的键的值,并保留未找到键的当前值

有人能指出我做错了什么吗?或者也许有一个更简单的方法来实现这一点


谢谢

看起来您只是在第三个字段中搜索第一个文件中不存在的密钥。试试这个:

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

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

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

这一行应该适合您:

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

这似乎起作用了,谢谢。因此,{$3=a[$1,$2]}中的($1,$2)检查以确保密钥在数组中,对吗?对。解决此问题的另一种常见方法是@Kent post解决方案,它通常使用名为
seen[]
的数组来表示以前见过索引。我将更新我的答案,以包括该版本。谢谢你的回答!末尾的7表示什么?与您的
1
相同,它(非零数字)不打印@泰克