Combinez deux fichiers sous Linux sans répétition

J’ai deux fichiers file1 et file2

Le contenu de fichier1 est

Hello how are you when can i meet you film?? 

Le contenu de fichier2 est

 Hello how are you darling when can i meet you 

Je veux générer un fichier qui est une combinaison de deux fichiers comme

 Hello how are you darling when can i meet you film?? 

Remarque: L’espace dans la deuxième ligne de file1 doit être ignoré dans le fichier final. Existe-t-il une fonction intégrée dans C ou Linux pour effectuer le travail ci-dessus ou un script peut-il être écrit à cet effet?

Voici un moyen d’utiliser awk :

 awk '{ gsub(/^[ \t]+|[ \t]+$/,"") } !a[$0]++' file2 file1 

Résultats:

 Hello how are you darling when can i meet you film?? 

MODIFIER:

Le problème avec:

 awk '{ $1=$1 } !a[$0]++' file2 file1 

Est-ce que, même si cela fonctionne bien pour cet exemple simple, il traitera les lignes similaires de la même manière, car non seulement il supprime les espaces avant et arrière, mais il supprime également les espaces blancs entre les champs. Par exemple, si file1 contient:

 Hello how are you when can i meet you film?? 

Les deux:

 when can i meet you 

et:

 when can i meet you 

les lignes seraient traitées comme la même chose. Cela peut être le résultat souhaité, mais sur la base de votre question, je pense qu’il est préférable de simplement supprimer les espaces blancs avant et arrière selon la première commande. HTH.

Travail facile pour awk :

 $ awk '{$1=$1}!u[$0]++' file2 file1 Hello how are you darling when can i meet you film?? 

Ou si vous ne vous souciez pas de l’ordre de sortie:

 $ sed 's/^\s*//' file1 file2 | sort -u are you darling film?? Hello how when can i meet you 

Vous pouvez appliquer plusieurs filtres standard:

 cat file1 file2 | perl -pe 's/^\s+//' | sort | uniq 
  • cat est utilisé pour concaténer tous les fichiers requirejs,
  • perl est autorisé à supprimer tout l’espace initial,
  • sort toutes les lignes,
  • et uniq supprime les lignes en double.