2013-08-02 5 views
2

J'ai 100 fichiers .txt avec ~ 1 mln lignes chacun.Supprimer des lignes dupliquées à partir de plusieurs fichiers texte

Existe-t-il un moyen d'ouvrir tous les fichiers, supprimer les doublons et enregistrer les lignes en conséquence pour chaque fichier (php/unix etc)?


Par exemple:

contenu du FILE1.TXT

Something here1 
Something here2 

contenu FILE2.TXT

Something here2 
Something here3 

Après le retrait:

contenu FILE1.TXT

Something here1 
Something here2 

contenu FILE2.TXT

Something here 3 
+0

J'ai eu deux réponses différentes d'abord, puis je regardais un peu plus à votre question. C'est plus difficile que je ne le pensais. Pour d'autres prétendants, notez que l'OP souhaite supprimer des lignes d'un fichier s'il existe dans un autre fichier. Ceci est différent, il suffit de supprimer toutes les lignes en double dans chaque fichier. – brianmearns

+0

L'ordre des lignes est-il important dans chaque fichier lorsque vous avez terminé? Sinon, la commande 'sort -u' peut être utile, mais elle ne fait pas directement ce que vous cherchez. Ce peut être un point de départ cependant, pour quelqu'un de plus intelligent que moi-même. – brianmearns

+0

Oui, je les ai déjà triés, maintenant je dois également supprimer les doublons des autres fichiers. –

Répondre

0

J'ai testé cela, cela fonctionne. L'ordre des lignes n'est pas conservé dans chaque fichier, mais vous avez dit dans un commentaire que vous avez déjà appliqué sort, donc cela n'a pas d'importance. Il est un peu rond-point, mais il fonctionne:

#!/bin/bash 

    #The number of files you have, named like file1.txt, file2.txt, etc. 
    # If named otherwise, cahnge the definition of variable "file" in the loop below. 
    NUM_FILES=3 

    #These files will be created and removed during the script, so make sure they're 
    # not files you already have around. 
    tempfile1="_all.txt" 
    tempfile2="_tmp.txt" 

    sort -u file1.txt > file1out.txt 
    cat file1out.txt > $tempfile1 

    for i in $(seq 2 $NUM_FILES) 
    do 
     prev=$((i-1)) 
     pofile="file${prev}out.txt" 
     file="file$i.txt" 
     ofile="file${i}out.txt" 

     echo "Input files: $file $pofile" 
     echo "Output file: $ofile" 
     cat $tempfile1 $pofile > $tempfile2 
     sort -u $tempfile2 > $tempfile1 
     sort -u $file | comm -23 - $tempfile1 > $ofile 
    done 

    rm -f $tempfile1 $tempfile2 
+0

Merci beaucoup, a parfaitement fonctionné! –

+0

Super, contente je l'ai finalement compris, il a fallu quelques essais. J'espère que le script a aussi du sens pour vous. – brianmearns

1

utilisant Unix type & grep:

Si l'ordre des lignes n'a pas d'importance:

sort -u file1.txt > _temp && mv _temp file1.txt 

Si l'ordre des lignes matières:

awk 'FNR==NR{a[$0];next} ($0 in a) {delete a[$0]; print}' file1.txt file1.txt _temp && mv _temp file1.txt 
grep -v -f file1.txt file2.txt > _temp && mv _temp file2.txt 
+1

La première solution a fonctionné pour moi .. merci –

0
  • obtenir la chaque ligne du fichier sous forme de tableau
$file1 = explode("\n", file_get_contents('file1.txt')); 
$file2 = explode("\n", file_get_contents('file2.txt')); 
  • utilisation array_unique pour supprimer les doublons avec dans le fichier
$f1 = array_unique($file1); 
$f2 = array_unique($file2); 
  • Supprimer les doublons de deuxième réseau Comparer avec la première
$new_f2 = array_diff($f2,$f1); 

Maintenant, vous avez $ f1 et new_f2 $ valeurs uniques.

Maintenant il suffit de mettre à jour les fichiers.

Remarque: pour plusieurs fichiers font récursive

Questions connexes