gpt4 book ai didi

linux - 比较两个 csv 文件并根据使用 awk 的比较更新字段

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:35 25 4
gpt4 key购买 nike

我有以下文件:

file1.csv

ID, Name, Address, Phone, Favorite Color/Colors Match
1, Jim, 12 Main,123-456-7890, Blue
2, Kim,11 Bush,987-654-3210, RedGreen
3, Tim,33 Main,111-111-1111,YellowOrange
4, Zim,66 Main,111-555-1111,YellowOrange

file2.csv

ID, Name, Address, Phone, Favorite Color/Colors Match, Blood Type, Left/Right Handed
1, Jon, 122 Main,333-456-7890, Red, A Pos, Right
2, Tom,111 Bush,999-654-3210, RedGreen, A Neg, Right
3, Tam,333 Main,111-222-1111,YellowOrange, O Neg, Left
4, Zam,99 Main,555-555-1111,Blue, A Pos, Left

我希望每个文件的输出如下:

file1.csv

ID, Name, Address, Phone, Favorite Color/Colors Match
1, Jim, 12 Main,123-456-7890, No Match
2, Kim,11 Bush,987-654-3210, Match
3, Tim,33 Main,111-111-1111,Match
4, Zim,66 Main,111-555-1111,No Match

file2.csv

ID, Name, Address, Phone, Favorite Color/Colors Match, Blood Type, Left/Right Handed
1, Jon, 122 Main,333-456-7890, No Match, A Pos, Right
2, Tom,111 Bush,999-654-3210, Match, A Neg, Right
3, Tam,333 Main,111-222-1111,Match, O Neg, Left
4, Zam,99 Main,555-555-1111,No Match, A Pos, Left

基本上,我想根据两个单独文件中的 ID 字段来比较一个字段,并确定它们是否匹配。

我尝试使用 awk 执行此操作:

awk -F',' 'NR==FNR {n[$5]=$0} {if ($1 == n[$1] && $5 == n[$5])    
n[$5]="Match"; else $n[5]="No Match";}1' OFS=, file1.csv file2.csv > testfile.csv

但我得到了一些意想不到的结果。我是 awk 的新手,所以任何建议都将不胜感激。谢谢。

最佳答案

您可以像这样使用 awk:

cat csv.awk

BEGIN{FS=OFS=","}
FNR==NR {
a[$1 SUBSEP $5]
next
}
{
$5 = (($1 SUBSEP $5) in a)?"Match":"No Match"
}
1

然后将其用作:

awk -f csv.awk file2.csv file1.csv

ID, Name, Address, Phone,Match
1, Jim, 12 Main,123-456-7890,No Match
2, Kim,11 Bush,987-654-3210,Match
3, Tim,33 Main,111-111-1111,Match
4, Zim,66 Main,111-555-1111,No Match

还有:

awk -f csv.awk file1.csv file2.csv

ID, Name, Address, Phone,Match, Blood Type, Left/Right Handed
1, Jon, 122 Main,333-456-7890,No Match, A Pos, Right
2, Tom,111 Bush,999-654-3210,Match, A Neg, Right
3, Tam,333 Main,111-222-1111,Match, O Neg, Left
4, Zam,99 Main,555-555-1111,No Match, A Pos, Left

更新:如果您想通过单个 awk 命令完成它,那么就在这里。

cat csv.awk 

BEGIN{FS=OFS=","}
{
key = $1 SUBSEP $5
}
FNR == NR {
a[key]
next
}
FILENAME == ARGV[2] {
if (key in a) {
$5 = "Match"
b[key]
}
else
$5 = "No Match"
print > "_" ARGV[2]
next
}
{
$5 = (key in b)?"Match":"No Match"
print > "_" ARGV[3]
}

然后执行为:

awk -f csv.awk file2.csv file1.csv file2.csv &&
mv _file1.csv file1.csv &&
mv _filw2.csv file2.csv

关于linux - 比较两个 csv 文件并根据使用 awk 的比较更新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39961905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com