Tem duas listas, deseja excluir list2 da list1

0

Lista1 :

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

List2 :

3
13
14
6
1
7
15
26

Eu preciso de uma saída como:

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

A saída deve conter itens da coluna # 1 de List1 que não estão em List2 .

Lista1 e Lista2 não são ordenadas, mas classificarei ambas as listas, se necessário. Lista1 tem cerca de 60.000 registros e List2 contém 20,0000. Precisa de solução usando o shell do Linux ou mysql .

    
por kcmakwana 20.07.2018 / 06:51

3 respostas

4

Assumindo que bash é usado (caso contrário, pré-classifique os arquivos de entrada com sort -o List1 List1 e sort -o List2 List2 e use List1 List2 em vez das substituições do processo):

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

Isso faz uma operação de JOIN relacional entre seus dois arquivos, classificando o conteúdo primeiro. O -t, informa join para tratar vírgulas como o delimitador de campo e, com -v1 , solicitamos as entradas no primeiro arquivo que não se associa a nenhuma entrada no segundo. A junção acontece por padrão no primeiro campo de cada arquivo.

Para remover o último inteiro deste:

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

Para uma solução MySQL, você teria que fornecer o esquema SQL para as tabelas envolvidas, mas a consulta resultante seria parecida com

SELECT * FROM table1 WHERE joinfield1 NOT IN (SELECT joinfield2 FROM table2);
    
por 20.07.2018 / 08:34
0

Usando grep :

grep -wvf List2 List1

Saída:

2,name2
4,name4
5,name5
8,name8
9,name9
    
por 20.07.2018 / 09:06
0

Tente isso,

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 : salva o primeiro campo em uma matriz. Então,
  • a[$1] == 0 : o bloco else só será executado se este for o segundo arquivo, então verificaremos se o campo 1 deste arquivo já foi visto ( a[$1]==0 ).
por 20.07.2018 / 08:00