Как удалить повторяющиеся записи из файла с разделителями в файле Linux (myfile_I.out: application / octet-stream; charset = binary) - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь загрузить данные из файла linux (который содержит дубликаты и данные выгружаются из исходной таблицы) в таблицу.

     mylinux file properties: 
     $ file -bi myfile_I.out
     application/octet-stream; charset=binary

перед загрузкой данных в таблицу. Я должен удалить дубликаты из файла linux.

Мой подход к удалению дубликатов:

  1. Выгрузка данных из исходной таблицы во временный файл (TempeEX.out)
  2. из файла TempEX.out выполнил функцию sort -u и удалил дубликаты и окончательные записи уникальных данных загружаются в myfile_I.out
  3. Наконец загрузите данные myfile_I.out в target_table

У меня проблема в ШАГЕ 2 {Невозможно удалить полные дубликаты из файла TempEX.out}

    #------------------------------------------------------------------#
    #- Delete the duplicates from TempEX.out write the unique data-----# 
    #------------------to myfile_I.out----------------------------------#

    echo -e "Eliminate the duplicates from the ${FILE_PATH}/TempEX.out 
    file" >> ${LOG}

    sort -u  ${FILE_PATH}/TempEX.out > ${DEST_PATH}/myfile_I.out

    echo -e "Unique records successfully written into 
    ${DEST_PATH}/myfile_I.out" >> ${LOG}

    count=0
    while read
    do
    ((count=$count+1))
    done <${DEST_PATH}/myfile_I.out
    echo -e "Total No of unique records in ${DEST_PATH}/myfile_I.out:" 
    ${count} "\n" >> $LOG
     #-----------------------------------------------------------------#

Фактические результаты:

   Counts:

    $wc -l TempEX.out myfile_I.out
    196466 TempEX.out  -->#File Contains duplicate records#
    196460 myfile_I.out-->#Unique records after my approach(sort -u)# 
    392926 total

Я сделал несколько функций сортировки, чтобы узнать дубликаты, присутствующие в myfile_I.out Количество повторяющихся записей в файле TempEX.out

    $ cut -d'^X' -f1,6,10 TempEX.out|sort|uniq -d|wc -l
    5

Количество повторяющихся записей в файле myfile_I.out

    $ cut -d'^X' -f1,6,10 myfile_I.out|sort|uniq -d|wc -l
    1

Получил, какие записи (на primary_key), имеющие дубликаты в файле TempEX.out

    $ cut -d'^X' -f1,6,10 TempEX.out|sort|uniq -d|cat
    701234567      412345678        19
    701234568      412345677        18
    709875641      412345859        17
    701234569      425984031        21
    701234570      409845216        20

Получил, какие записи (на primary_key), имеющие дубликаты в файле myfile_I.out

    $ cut -d'^X' -f1,6,10 myfile_I.out|sort|uniq -d|cat
    709875641      412345859        17

Ожидаемые результаты: Чтобы удалить дубликаты из файла TempEX.out, загрузите уникальные данные в myfile_I.out.

    sort -u TempEX.out > myfile_I.out /*cant resolving the issue*/

Можем ли мы сделать что-то подобное? (Выполнить первичные ключи)

    sort -u -f1,6,10 TempEX.out > myfile_I.out

1 Ответ

0 голосов
/ 02 июля 2019

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

Это написано в комментариях, но, чтобы быть уверенным, ни одно поле ни в одном столбце не должно иметь значение с пробелом.

#!/bin/ksh

TIMESTAMP=$(date +"%Y%m%d%H%M")

#No sense to do anything if the files are not readable.
if [[ ! -r $1 || ! -r $2 ]]; then
    print "ERROR - You must provide 2 parameters : 1 = path/filename of DB content 2 = path/filename of New Data"
    exit
fi

#Declaring 2 associative matrix
typeset -A TableDB
typeset -A DataToAdd

#Opening the different files. 3 and 4 for reading and 5 and 6 for writting.
#File handlers : 
# 3 for the data from the DB, 
# 4 for the new data to add, 
# 5 to write the new data to load (unique and new), 
# 6 to write the data in problem (same primary key but with different values)
exec 3<$1
exec 4<$2
exec 5>Data2Load_${TIMESTAMP}.txt
exec 6>Data2Verify_${TIMESTAMP}.txt

#Loading the 2 matrix with their data. 
#Here it is assumed that no field in any column contain blank spaces.
#Working with only 3 columns as in the example
while read -u3 a b c && read -u4 d e f; do
        TableDB[$a]=( $a $b $c )
        DataToAdd[$d]=( $d $e $f )
done

#Checking for duplicate and writting only the new one to load without the lines in possible errors
for i in ${!DataToAdd[@]}; do
        if [[ -z ${TableDB[$i]} ]]; then
                print -u5 "${DataToAdd[$i][0]} ${DataToAdd[$i][1]} ${DataToAdd[$i][2]}"
        elif [[ ${DataToAdd[$i][1]} != ${TableDB[$i][1]} || ${DataToAdd[$i][2]} != ${TableDB[$i][2]} ]]; then
                print -u6 "${DataToAdd[$i][0]} ${DataToAdd[$i][1]} ${DataToAdd[$i][2]}"
        fi
done

#closing the different files
exec 3>&-
exec 4>&-
exec 5>&-
exec 6>&-

Надеюсь, это поможет!

...