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