gpt4 book ai didi

awk - bash - 将一个文件的两列与第二个文件的一列进行比较并打印匹配项

转载 作者:行者123 更新时间:2023-12-02 07:57:34 25 4
gpt4 key购买 nike

我有两个不同的文件,每个文件大约有 1000 行,结构如下:

文件 1:(名字;姓氏;地址)

Mike;Tyson;First Street 2
Tom;Boyden;Second Street 6
Tom;Cruise;Third Street 9
Mike;Myers;Second Street 4

file2:(名字姓氏;电子邮件;ID)或(姓氏名字;电子邮件;ID)

Mike Tyson;mike@tyson.com;45753
Cruise Tom;tom@cruise.com;23562
Jennifer Lopez;jennifer@lopez.com;92746
Brady Tom;tom@brady.com;27583

我想将 file1 的前两列与 file2 的整个第一列进行比较。如果 file1 的两个条目都出现在 file2 的第一列中(以任一顺序),我想打印 file1 的匹配行。然后搜索 file1 的第二行并再次将其与 file2 的整个列进行比较,依此类推。

在文件 2 中,顺序可以是(名字姓氏)或(姓氏名字),我想在这两种情况下打印匹配的行。

预期输出:

Mike;Tyson;First Street 2
Tom;Cruise;Third Street 9

我对使用 awk、grep 或其他任何工具的解决方案感到满意。

我试过类似问题的解决方案,但输出为空:

awk -F';' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2

谢谢

最佳答案

$ awk -F'[ ;]' '
{ key=($1 > $2 ? $1 FS $2 : $2 FS $1) }
NR==FNR { a[key]; next }
key in a
' file1 file2
Mike Tyson;mike@tyson.com;45753
Cruise Tom;tom@cruise.com;23562

上面使用通用的、惯用的方法来生成一致的键,而不考虑键组件出现的顺序,方法是在连接它们以创建键值之前对组件进行排序。当只有 2 个组件(如本例)时,只需进行简单的比较即可。

这就是为什么对键的组件进行排序是正确的方法。假设您有 3 个组件,$1、$2 和 $3,而不仅仅是 2 个。通过测试每个组合的方法,您需要这样:

NR==FNR { a[$1,$2,$3]; next }
($1,$2,$3) in a || ($1,$3,$2) in a || ($2,$1,$3) in a ||
($2,$3,$1) in a || ($3,$1,$2) in a || ($3,$2,$1) in a

尝试为 $1 到 $4 编写该条件 :-)。

相比之下,如果您使用对组件进行排序的方法(为方便起见,使用 GNU awk 进行内置排序功能),则更难出错(例如,通过在比较中忘记组合):

NR==FNR {
split($1 FS $2 FS $3,flds)
asort(flds)
key = flds[1]
for (i=2; i in flds; i++) {
key = key FS flds[i]
}
a[key]
next
}
key in a

现在想象一下,如果您想以任何顺序使用 $1 到 $10。 “测试组件方法的每个组合”成为一个难以为继的噩梦,而“对组件进行排序以创建键”方法只是意味着在第一个 split() 参数中向列表中简单地添加字段。

关于awk - bash - 将一个文件的两列与第二个文件的一列进行比较并打印匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61611544/

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