2013-08-02 9 views
2

У меня есть 100 файлов .txt с ~ 1 млн строк.Удалите повторяющиеся строки из нескольких текстовых файлов

Есть ли способ открыть все файлы, удалить дубликаты и сохранить строки в соответствии с каждым файлом (php/unix и т. Д.)?


Например:

file1.txt содержание

Something here1 
Something here2 

содержание file2.txt

Something here2 
Something here3 

После удаления:

FILE1.TXT содержание

Something here1 
Something here2 

содержание file2.txt

Something here 3 
+0

У меня было два разных ответа на первый, то я был немного ближе на ваш вопрос. Это сложнее, чем я думал. Для других потенциальных ответчиков обратите внимание, что OP хочет удалить строки из одного файла, если они существуют в любом другом файле. Это другое, чем просто удаление всех повторяющихся строк в каждом файле. – brianmearns

+0

Выполняет ли порядок строк в каждом файле, когда вы закончите? Если нет, команда 'sort -u' может быть полезна, но она не делает прямо то, что вы ищете. Это может быть отправной точкой, хотя для кого-то умнее меня. – brianmearns

+0

Да, я уже сортирую -u их, теперь мне нужно также удалить дубликаты из других файлов. –

ответ

0

Я испытал это, он работает. Порядок строк не поддерживается в каждом файле, но вы сказали в комментарии, что вы уже применяете sort, так что это не имеет значения. Это немного окольным, но это делает работу:

#!/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

Спасибо большое, отлично! –

+0

Отличный, рад, что, наконец, понял, потребовалось несколько попыток. Надеюсь, что сценарий имеет смысл и для вас. – brianmearns

1

Использование Unix рода & Grep:

Если порядок строк не имеет значения:

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

Если порядок строк вопросы:

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

Первое решение работало для меня .. спасибо –

0
  • получить каждую строку файла в виде массива
$file1 = explode("\n", file_get_contents('file1.txt')); 
$file2 = explode("\n", file_get_contents('file2.txt')); 
  • использовать array_unique, чтобы удалить дубликаты в файле
$f1 = array_unique($file1); 
$f2 = array_unique($file2); 
  • Удаление дубликатов из второго массива сравнить с первым
$new_f2 = array_diff($f2,$f1); 

Теперь у вас есть $ f1 и $ new_f2 уникальных значений.

Теперь просто обновите файлы.

Примечание: для нескольких файлов сделать это рекурсивно

Смежные вопросы