gpt4 book ai didi

linux - 如何从Linux文件中的分隔文件中消除重复记录(myfile_I.out : application/octet-stream; charset=binary)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:49 25 4
gpt4 key购买 nike

我正在尝试将数据从 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

在 TempEX.out 文件中得到哪些记录(在 primary_key 上)有重复

    $ 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

在 myfile_I.out 文件中得到哪些记录(在 primary_key 上)有重复

    $ 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

最佳答案

这是一个可能有用的小脚本。它不会用新数据修改原始文件,而是创建一个新文件进行加载(我总是喜欢保留原始文件以防出错)。它正在对主键进行验证,但会确保在主键重复的情况下其他列也相同。合理的是,即使您不提及它,也可能会修改现有数据或输入系统中的错误。无论如何,脚本会将这些行发送到不同的文件中以供用户查看。

它写在评论中,但只是为了确定,任何列中的任何字段都不应具有带空格的值。

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

希望对您有所帮助!

关于linux - 如何从Linux文件中的分隔文件中消除重复记录(myfile_I.out : application/octet-stream; charset=binary),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com