두 개의 정렬된 파일의 레코드 병합

두 개의 정렬된 파일의 레코드 병합

6백만 개가 넘는 레코드가 포함된 두 개의 큰 파일이 있습니다. 이 두 파일의 데이터는 다음과 같이 연관될 수 있습니다.사용자 ID(파일을 주문하는 경우 두 파일이 같은 줄에 있어야 합니다.) 궁극적으로 두 번째 파일의 데이터와 연결된 첫 번째 파일의 데이터를 가져와야 합니다.

문제는 스크립트를 실행하면 약 650,000개의 레코드를 처리하는 데 10시간이 걸린다는 것입니다!

나는 그것을 개선하고 싶다.

UIDS=`cut -f1 -d',' sorted_UID_data1.txt`

for record in $UIDS
do
    echo `grep $record sorted_UID_data1.txt| awk -F ',' '{print $2}'`,`grep $record sorted_UID_data2.txt` >> data.txt
done

그것을 최적화하기 위해 나는 생각했습니다.

TOTAL_RECORDS=`wc -l < sorted_UID_data1.txt`

recordId=1
while [ $recordId -le $TOTAL_RECORDS ]
do
    echo `sed -n "${recordId}{p;q;}" sorted_UID_data1.txt| awk -F ',' '{print $2}'`,`sed -n "${recordId}{p;q;}" sorted_UID_data2.txt` >> data.txt
    recordId=$(( $recordId + 1 ))
done

시간도 너무 많이 걸렸습니다.

하지만 그때 저는 생각했습니다. 항상 파일의 첫 번째 줄을 잡을 수 있다면 어떨까? 나는 이것이 다음을 통해 수행될 수 있다는 것을 보았습니다.sed,꼬리, 또는AWK, 그러나 이는 비효율적인 것 같습니다.

이 문제를 어떻게 해결할 수 있나요?

답변1

첫 번째 행을 삭제하려면 다음을 사용하십시오 tail.

# seq 5 | tail -n +2
2
3
4
5

"첫 번째 행을 가져오려면" 다음만 사용하세요 head.

# seq 5 | head -n 1
1

그러나 두 파일을 한 줄씩 연결하려면 다음을 사용하십시오 paste.

# seq 5 > nums
# echo -e 'a\nb\nc\nd\ne' > chars
# paste nums chars     
1       a
2       b
3       c
4       d
5       e

일치하는 공통 파일로 두 파일을 결합하려면 다음을 사용하십시오 join.

# paste -d , <( seq 5 ) <( seq 11 15 ) > teens
# paste -d , <( seq 5 ) <( seq 21 25 ) > twenties
# join -t , teens twenties
1,11,21
2,12,22
3,13,23
4,14,24
5,15,25

답변2

키 필드를 사용할 때는 다음을 사용하는 것이 좋습니다.가입하다

join -t ',' sorted_UID_data1.txt sorted_UID_data2.txt

관련 정보