2つのリストがありますが、list1からlist2を除外したいと思います。

2つのリストがありますが、list1からlist2を除外したいと思います。

リスト1:

1,name1                   
2,name2                    
3,name3                  
4,name4                   
5,name5                  
6,name6                  
7,name7                  
8,name8                  
9,name9                  

リスト2:

3
13
14
6
1
7
15
26

次の出力が必要です。

2,name
4,name
5,name
8,name
9,name

出力には列1の項目を含める必要があります。リスト1どんなものはありませんか?リスト2

リスト1そしてリスト2ソートされていませんが、必要に応じて両方のリストをソートします。
リスト1約60,000のレコードがあり、List2には20,0000のレコードが含まれています。 Linuxシェルまたはmysql

答え1

以下を使用すると仮定しますbash(そうでない場合、およびを使用して入力ファイルを事前にソートし、手続き型置換のsort -o List1 List1代わりにsort -o List2 List2使用)。List1 List2

$ join -t, -v1 <( sort List1 ) <( sort List2 )
2,name2
4,name4
5,name5
8,name8
9,name9

これにより、2つのファイル間でリレーショナルJOIN操作が実行され、まずその内容がソートされます。カンマをフィールド区切り文字として扱うように指示し、-t,最初のファイルのエントリが2番目のファイルのエントリに関連付けられないようにします。デフォルトでは、接続は各ファイルの最初のフィールドで行われます。join-v1

最後の整数を削除するには:

join -t, -v1 <( sort List1 ) <( sort List2 ) | sed 's/[0-9]*$//'

MySQLソリューションでは、関連テーブルのSQLスキーマを提供する必要がありますが、結果のクエリは次のとおりです。

SELECT * FROM table1 WHERE joinfield1 NOT IN (SELECT joinfield2 FROM table2);

答え2

使用grep:

grep -wvf List2 List1

出力:

2,name2
4,name4
5,name5
8,name8
9,name9

答え3

この試み、

awk -F ',' 'NR==FNR{a[$1]++;next};a[$1] == 0'  List2  List1

2,name2                    
4,name4                   
5,name5                  
8,name8                  
9,name9
  • a[$1]++; next:配列の最初のフィールドを保存します。次に、
  • a[$1] == 0:elseブロックは、これが2番目のファイルの場合にのみ実行されるため、そのファイルのフィールド1が表示されていることを確認します(a[$1]==0)。

関連情報