将一个文件中第二列的电子邮件与另一个文件进行匹配

时间:2019-12-29 09:33:09

标签: linux awk grep

我有两个文件,一个文件中包含电子邮件(useremail.txt),另一个文件中包含电子邮件:phonenumber(emailnumber.txt)。

useremail.txt包含:

John smith:blabla@hotmail.com

David smith:haha@gmail.com

emailnumber.txt包含:

blabla@hotmail.com:093748594

因此,该解决方案需要从useremail的第二列中获取电子邮件,然后搜索emailnumber文件并找到匹配项并输出John smith:093748594,因此只需输入姓名和电话号码即可。

我在Windows上,所以我需要一个gawk或grep解决方案,我已经尝试了很长时间,试图使其与awk / grep一起使用,但是找不到正确的解决方案,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

 awk -F":" '(FNR==NR){a[$2]=$1}(FNR!=NR){print a[$1]":"$2}' useremail.txt emailnumber.txt

如果emailnumber.txt中有条目,而useremail.txt中没有匹配条目:

awk -F":" '(FNR==NR){a[$2]=$1}(FNR!=NR){if(a[$1]){print a[$1]":"$2}}' useremail.txt emailnumber.txt

答案 1 :(得分:1)

另一个(GNU)awk:

$ awk '
BEGIN {
    # RS=ORS="\r\n"       # since you are using GNU awk this replaces the sub()
    FS=OFS=":"            # input and output field separators
}
NR==FNR {                 # processing the first file
    sub(/\r$/,"",$NF)     # remove the \r after the email OR uncomment RS above
    a[$2]=$1              # hash name, index on email
    next                  # on to the next record
}
($1 in a) {               # if email in second file matches one in hash
    print a[$1],$2        # output. If ORS uncommented above, output ends in \r
                          # if not, you may want to add it to the print ... "\r"
}' useremail emailnumber

输出:

John smith:093748594

由于您在Linux和Windows上尝试了可接受的答案,并且使用了GNU awk,因此将来可以设置RS="\r?\n",它接受​​两种形式,\r\n和裸\n。但是,我最近在特定条件下遇到了该表格的问题(对此我尚未提交错误报告)。