我有两个文件:“文件 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