他のファイルに既に存在する限り、CSVファイルのエントリの削除

他のファイルに既に存在する限り、CSVファイルのエントリの削除

2つのファイルがあります。 「ファイル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これら2つのファイルを比較し、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',' カンマ区切り文字があるか|、 。-F'|'

スクリプトは次のようになります。

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

関連情報