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