Jointure interne sur deux fichiers texte

Vous cherchez à effectuer une jointure interne sur deux fichiers texte différents. Fondamentalement, je recherche l’équivalent de jointure interne du programme de jointure GNU. Est-ce qu’une telle chose existe? Sinon, une solution awk ou sed serait très utile, mais mon premier choix serait une commande Linux.

Voici un exemple de ce que je cherche à faire

dossier 1:

 0|Alien Registration Card LUA|Checklist Update 1|Alien Registration Card LUA|Document App Plan 2|Alien Registration Card LUA|SA Application Nbr 3|Alien Registration Card LUA|tmp_preapp-DOB 0|App - CSCE Certificate LUA|Admit Type 1|App - CSCE Certificate LUA|Alias 1 2|App - CSCE Certificate LUA|Alias 2 3|App - CSCE Certificate LUA|Alias 3 4|App - CSCE Certificate LUA|Alias 4 

dossier 2:

 Alien Registration Card LUA 

Résultats:

 0|Alien Registration Card LUA|Checklist Update 1|Alien Registration Card LUA|Document App Plan 2|Alien Registration Card LUA|SA Application Nbr 3|Alien Registration Card LUA|tmp_preapp-DOB 

Le fichier2 ne devrait-il pas contenir LUA à la fin?

Si oui, vous pouvez toujours utiliser join :

 join -t'|' -12 <(sort -t'|' -k2 file1) file2 

Vous pouvez modifier ce script:

 cat file2 | while read line; do grep $line file1 # or whatever you want to do with the $line variable done 

while boucle lit fichier2 ligne par ligne et donne cette ligne à la commande grep qui écrit cette ligne dans fichier1. Il y a des sorties supplémentaires qui peuvent être supprimées avec les options grep.

Voici une option awk, vous pouvez donc éviter la dépendance bash (pour la portabilité):

 $ awk -F'|' 'NR==FNR{check[$0];next} $2 in check' file2 file1 

Comment cela marche-t-il?

  • -F'|' – définit le séparateur de champ
  • 'NR==FNR{check[$0];next} – si le nombre total d’enregistrements correspond au numéro d’enregistrement du fichier (c’est-à-dire que nous lisons le premier fichier fourni), nous remplissons un tableau et continuons.
  • $2 in check – Si le deuxième champ a été mentionné dans le tableau que nous avons créé, imprimez la ligne (qui est l’action par défaut si aucune action n’est fournie).
  • file2 file1 – les fichiers. L’ordre est important en raison de la construction NR==FNR .

On dirait que vous avez juste besoin

 grep -F -f file2 file1 

Vous pouvez utiliser la commande coller pour combiner le fichier:

 paste [option] source files [>destination file] 

pour votre exemple, il serait

 paste file1.txt file2.txt >result.txt