面试题答案
一键面试设计思路
- 逐行处理文件:由于文件过大不能一次性读入内存,采用逐行读取的方式。
- 提取数字并排序:使用正则表达式提取每行字符串中的数字部分,根据提取的数字进行降序排序。
- 去除重复行:排序后,使用
uniq
命令去除重复行。 - 处理分隔符:通过脚本参数传入分隔符,在提取数字时使用该分隔符。
实现代码
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <separator>"
exit 1
fi
separator=$1
# 逐行读取文件,提取数字并加上原行,然后进行排序
sort -t "$separator" -k 2 -nr -s -T /tmp <<< "$(while read line; do
number=$(echo "$line" | grep -oE "[0-9]+" | head -n 1)
echo "$number $line"
done < large_data.txt)" | cut -d ' ' -f 2- | uniq
代码解释
- 参数检查:首先检查脚本执行时是否传入了一个参数(分隔符),如果没有则提示用法并退出。
- 提取数字并排序:
- 使用
while read line
逐行读取large_data.txt
文件。 - 通过
grep -oE "[0-9]+" | head -n 1
提取每行中的第一个数字部分。 - 将提取的数字和原行一起输出,格式为
数字 原行
。 - 使用
sort
命令对输出进行排序,-t "$separator"
指定分隔符,-k 2
表示按第二个字段(即提取的数字)排序,-nr
表示降序排序,-s
表示稳定排序,-T /tmp
指定临时文件目录(用于处理大数据量时排序的临时文件存储)。
- 使用
- 去除重复行:
- 使用
cut -d ' ' -f 2-
去除排序结果中每行开头的数字部分,只保留原行。 - 最后使用
uniq
命令去除重复行。
- 使用