Unix Script занимает больше времени, можем ли мы его оптимизировать - PullRequest
0 голосов
/ 04 сентября 2018
seq_no=1
for line in `cat temp1_other.txt`
do
    pk=`echo "$line" | cut -d '|' -f41`
    seq_no=`expr "$seq_no" + 1`
    line1=`sed -n ''$seq_no'p' temp1_other.txt`
    pk_next=`echo "$line1" | cut -d '|' -f41`
        if [ "$pk" == "$pk_next" ]; then
        echo $line >> exam_duplicate.txt
        else
        echo $line >> exam_non_duplicate.txt
        fi
done

Попытка прочитать файл и сравнить столбец текущей строки и столбца следующей строки, чтобы проверить наличие дублирующихся записей, для файла 60k-70k это занимает более 20 минут, можем ли мы его оптимизировать или достичь с помощью другой логики. в то время как цикл также занимает больше времени. Записи отсортированы с помощью команды "sort".

Пример данных:

Sam|1|IT|1st_Sem
Sam|1|CS|1st_Sem
Sam|1|CS|2nd_Sem
Peter|2|IT|2nd_sem
Ron|2|ECE|3rd_sem

Предположим, что 2-й столбец является ключевым столбцом, если 2-й столбец совпадает со следующей строкой 2-го столбца, он должен перейти к дублирующему файлу, если не соответствует, то он должен перейти к неповторяющемуся файлу.

Sam|1|IT|1st_Sem
Sam|1|CS|1st_Sem
Peter|2|IT|2nd_sem

Должен перейти к дублирующему файлу и остаться без дубликатов.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы используете Linux / bash? Чем вы можете попробовать

tac temp1_other.txt | sort -k2,2 -t'|' -u > exam_non_duplicate.txt

Сортировка смотрит только на второе поле и хочет сохранить первую запись, которую видит.
Вы хотите, чтобы последняя запись не дублировалась, поэтому мы конвертируем cat в tac.

Теперь вы хотите получить файл со всеми дубликатами, вы можете попробовать

grep -vFxf exam_non_duplicate.txt temp1_other.txt > exam_duplicate.txt

Это решение не будет работать, если у вас есть реальные дубликаты (завершите идентичные строки), когда один из них упоминается в exam_non_duplicate.txt.

0 голосов
/ 04 сентября 2018

Внешний порог cut убьет вашу производительность. Сделайте все это в awk:

    awk '{this=$2} 
    NR>1 {
        output = "exam" (this != prev ? "_non" : "") "_duplicate.txt";
        print last > output
    }
    {prev=this; last = $0} ' FS=\| input-file

(В этом примере используется пример клавиатуры в столбце 2. Измените $2 при необходимости.) Обратите внимание, что это нигде не запишет последнюю строку файла, но это достаточно просто для обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...