合并两个排序文件中的记录

合并两个排序文件中的记录

我有两个包含超过六百万条记录的大文件。这两个文件中的数据可以通过以下方式关联用户识别码(如果订购文件,则两个文件应位于同一行)。最终我需要从第一个文件中获取与第二个文件中的数据连接的数据。

问题是执行脚本需要 10 个小时才能处理大约 650,000 条记录!

我想改进它。

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

相关内容