我有一个包含键/值的基本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
中的密钥值,并保留未找到密钥的当前值。
有谁可以指出我做错了什么?或者也许有一种更简单的方法来实现这一目标。
谢谢!
答案 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