【问题标题】:Comparing Columns in Different CSV then Print Non-Matches比较不同 CSV 中的列,然后打印不匹配的列
【发布时间】:2017-12-01 01:00:18
【问题描述】:

我是一个脚本新手,我正在寻求帮助来构建一个 BASH 脚本来比较不同 CSV 文档中的不同列,然后打印不匹配的内容。我在下面提供了一个示例。

文件 1 员工 ID 号、姓氏、名字、首选名称、电子邮件地址

文件 2 员工姓名、电子邮件地址

我想比较两个文件中的电子邮件地址列。如果文件 1 不包含在文件 2 中找到的电子邮件地址,我想输出到一个新文件。

提前致谢!

【问题讨论】:

  • 谢谢 我想知道你在做什么。不认真,SO 不是代码编写服务,您尝试过什么吗?就像 file1 中的行循环(研究 while),提取电子邮件(研究剪切),grep 文件 2 中的电子邮件(好 grep!),如果它不存在输出到输出文件(回显行 >>newfile)。祝你好运,如果您遇到困难,请发布您的代码以便我们提供帮助。
  • 您好 Nic3500 - 感谢您如此迅速地回复。我尝试的第一件事是awk。我在 SO 上找到了一个类似的示例,我以我的结构为基础,但是在意外标记附近遇到语法错误 '(':awk -f FNR == NR { mem[ $1 $2 $3 $4 $5 ] = 1; print next} { key = $1 $2 $3 $4 $5 if( ! ( key in mem) ) print} 我还尝试了以下 grep:grep -vFxf file2.csv file1.csv > new.csvGrep 在某种意义上工作删除了一些条目,但不是全部。

标签: bash csv command-line-interface


【解决方案1】:

我会这样做:

#!/bin/bash
#
>output.txt

# Read file2.txt, line per line...
cat file2.txt | while read line2
do
    # Extract the email from the line
    email2=$(echo $line2 | cut -d',' -f2)

    # Verify if the email is in file1
    if [ $(grep -c $email2 file1.txt) -eq 0 ]
    then
        # It is not, so output the line from file2 to the output file
        echo $line2 >>output.txt
    fi
done

【讨论】:

  • 完美!谢谢!不是一直坐着等你,在此期间一直在努力。还想出了这个:for em in cut -d , -f 2 File2 |sort|uniq;做 sed -i.bak "/$em/d" File1 ; done 很抱歉格式不好,在使用 SO 时遇到困难
  • 没问题,cmets 对代码来说很糟糕,这就是为什么总是建议用代码编辑问题。
【解决方案2】:

电子邮件地址不区分大小写,在比较它们时应考虑到这一点。此版本使用一点 awk 来处理大小写位并选择每行中的最后一个字段 ($NF):

#!/bin/bash

our_addresses=( $(awk -F, '{print tolower($NF)}' file1) )
while read -r line; do
    this_address=$(awk -F, '{print tolower($NF)}' <<< "$line")
    if [[ ! " ${our_addresses[@]} " =~ " $this_address " ]]; then
        echo "$line"
    fi
done < file2

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多