删除一个 CSV 文件中已存在于另一文件中的条目

删除一个 CSV 文件中已存在于另一文件中的条目

我有两个文件:“文件 1”包含员工 ID 号,“文件 2”包含员工的完整数据库。它们是这样的:

  • file1
    123123
    222333
    
  • file2
    111222 Jones Sally
    111333 Johnson Roger
    123123 Doe John
    444555 Richardson George
    222333 Smith Jane
    223456 Alexander Philip
    

我想比较这两个文件并从中删除file2具有 ID 号的条目file1

我发现这个awk命令完美运行:

awk 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3

结果:

  • file3
    111222 Jones Sally
    111333 Johnson Roger
    444555 Richardson George
    223456 Alexander Philip
    

所以这按预期工作。

我的问题是这些文件实际上是简化的.csv文件,我必须使用逗号作为分隔符而不是空格。我已经尝试了我能想到的一切来使这项工作正常进行(即,-F,命令 中的任何地方),但没有成功。-F','-F","

我如何让它与.csv文件一起使用?

顺便说一句,我使用的是 MacBook Pro、OSX Lion!

答案1

我假设你的csv文件是这样的:

文件1

123123,,
222333,,

文件2

111222,Jones,Sally
111333,Johnson,Roger
123123,Doe,John
444555,Richardson,George
222333,Smith,Jane
223456,Alexander,Philip

您可以尝试使用该join命令,如下所示:

# join -t, -v 2 <(sort file1) <(sort file2)
111222,Jones,Sally
111333,Johnson,Roger
223456,Alexander,Philip
444555,Richardson,George

有关该命令的更多信息可以在此处找到:男人加入

join [OPTION]... FILE1 FILE2

-t CHAR
    use CHAR as input and output field separator 
-v FILENUM
    like -a FILENUM, but suppress joined output lines 

答案2

尝试这个:

awk 'BEGIN{FS=","};FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3

答案3

您还可以尝试以下Python2解决方案:

#!/usr/bin/env python2
import csv
with open('file_1') as f1:
    file_1_list = [line[0] for line in csv.reader(f1)]
with open('file_2') as f2:
    for line in csv.reader(f2):
        if line[0] not in file_1_list:
            print ' '.join(line)

答案4

添加-F',' 告诉 awk 有一个逗号分隔符或者您是否使用|.使用-F'|'

所以你的脚本现在应该是这样的

awk -F',' 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3

相关内容