셸 스 크 립 트 를 사용 하여 파일 데 이 터 를 빠르게 정렬 하고 다시 정렬 하 는 방법

19492 단어
앞에서 셸 스 크 립 트 를 통 해 10G 데 이 터 를 다시 가 져 오 는 글 을 쓴 적 이 있 습 니 다. '셸 명령 몇 개 로 10G 데 이 터 를 빠르게 가 져 오 세 요' 를 보십시오.그러나 오늘 또 다른 업 무 를 만 났 다. 업무 복잡 도 는 지난번 의 단순 함 보다 훨씬 중요 하고 복잡 하 다.오랫동안 방법 을 찾 지 못 해 셸 스 크 립 트 프로그램 으로 처리 했다.구체 적 인 업무 논리:
1. 우선 주어진 지정 에 따라 정렬
2. 정렬 후 주어진 필드 를 무 게 를 줄 이 고 무 게 를 줄 이 는 규칙 은 다음 과 같다.
a) 정렬 후 인접 한 N 줄 의 주어진 필드 값 이 같은 줄 이 두 줄 을 초과 하지 않 으 면 두 줄 이 모두 보 존 됩 니 다.
a) 정렬 후 인접 한 N 줄 의 주어진 필드 값 이 같은 줄 이 두 줄 을 초과 하면 첫 줄 과 끝 줄 을 유지 합 니 다.
이런 업무 논 리 는 사실 그리 어려워 보이 지 않 는 다.그런데 문제 가 생 겼 는데 어떻게 10 ~ 20G 의 데이터 에서 신속하게 처리 할 수 있 습 니까?인터넷 에서 오랫동안 상응하는 처리 방법 을 찾 지 못 해서 먼저 상대 적 으로 어 리 석 은 방법 으로 실현 하 였 다.
테스트 데이터:
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss
A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss

셸 스 크 립 트:
if [ "$#" != "2" ]; then
        echo "Usage:   1:    ,  2:   。"
        exit
fi
#       
filepath=$1
#       
orgfile=$filepath"/"$2
#          
#mergerfile="$orgfile"_merge.txt
#        
sortfile="$orgfile"_sort.txt
#      
result_unique="$orgfile"_result_unique.txt
echo "">$result_unique
#echo "  :$orgfile"
#echo "      ..."
#awk 'BEGIN{ FS=",";}{ print $1","$2","$3","$4","$5","$6","$7","$1$3$4 }' $orgfile > $mergerfile
#echo "      ..."

echo "     start..."
#sort -t $"," -k 1,1 -k 9,9 $mergerfile >$sortfile
sort -t $"," -k 1,2 $orgfile >$sortfile
echo "     end..."


printf "***********     start**************************
" echo "while read line " cnt=0 # firstline="" # lastline="" # key lastKey="" # linecount=`sed -n '$=' $sortfile` i=1 echo "linecount=========>>>>>>>$linecount" while read line || [[ -n "$line" ]]; do echo $line; # compare=`echo "$line"|awk -F ',' '{print $1$3$4}'` echo "compare=====$compare" # if [ "$i" != "$linecount" -a "$lastKey" = "$compare" ];then echo "[ = ]" cnt=$(expr $cnt + 1) lastline="$line" else # if [ "$firstline" = "" ];then firstline=$line cnt=1 #echo "$firstline" >> $result_unique fi #echo "----$i---------------->>>>>>>>>>>$cnt" if [ $cnt -gt 1 -o "$i" == "$linecount" ];then echo "----$i---------------->>>>>>>>>>>$cnt" if [ "$i" != "$linecount" -a "$lastline" != "" ];then echo "$lastline" >> $result_unique echo "$line" >> $result_unique fi # if [ "$i" == "$linecount" ];then echo "================last line===================" echo "$line" >> $result_unique fi firstline="$line" lastline="$line" cnt=1 elif [ $cnt -eq 1 ];then firstline=$line lastline="$line" cnt=1 echo "$lastline" >> $result_unique fi fi # key lastKey="$compare" let i++ done <$sortfile echo "******************* $orgfile ***************************" echo "******************* $result_unique ***************************" exit

스 크 립 트 에 실행 권한 추가:
chmod +x uniquefile.sh

셸 스 크 립 트 실행
sh ./uniquefile.sh ./        

결과:
[root@xddsdsdsddssd ~]# sh uniquefile.sh ./ testfile.csv 
     start...
     end...
***********     start**************************
while read line <. style="color:#008000;">//testfile.csv_sort.txt
linecount=========>>>>>>>6
A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss
compare=====A0223EE1IDJDJ2938X39284BEOQQQQ54876F0
A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss
compare=====A0223EE1IDJDJ2938X39284BEOQQQQ54876F0
[ = ]
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
----3---------------->>>>>>>>>>>2
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
[ = ]
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
[ = ]
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
----6---------------->>>>>>>>>>>3
================last line===================
*******************   .//testfile.csv     ***************************
*******************     .//testfile.csv_result_unique.txt ***************************

최종 결과 파일:
[root@wewewwew ~]# more testfile.csv_result_unique.txt 

A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss
A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss

시간 이 비교적 촉박 하 니 우선 이렇게 실현 합 시다.어떤 분 이 좋 은 방법 이 있 는 지 저 에 게 알려 주세요.

좋은 웹페이지 즐겨찾기