我正在寻找一种shell方法,以便对文件进行更高效的全局排序操作。特别是,我想根据键的值拆分文件(这样所有以相同键开头的行最终都在同一个文件中)。 (此命令将是第一步,然后对这些分区文件进行排序,例如。)
这可以通过执行类似的操作在文件的单次传递中完成,例如,对密钥进行散列模拟一些与最终分区文件数相对应的参数。
好奇是否有任何命令可以做这样的事情?
(例如,如果键只是单个字符,关键点是"所有" Bs和Ds最终在file1中,所有Ac和Cs最终都在file2等中,以便在对这些文件进行排序后,我们知道所有类似的键都是相互分组的。这里的一个动机是用shell命令演示map-reduce的哈希分区。)
答案 0 :(得分:1)
忽略您的参数,创建密钥文件非常简单。
从文件中获取所有唯一键:
unique_keys=`cut -f1 ${input_file} | sort -u`
找到原始文件中的每个密钥,并将每个密钥放在自己的索引文件中:
for key in $unique_keys
do
grep "^${key} " ${input_file} >> ${key}_index
done
这会留下像
这样的文件A_index
A value4
A value1
A value2
B_index
B value2
B value3
C_index
C value5
等等。
除了使用某些固定值对索引进行分组之外,限制索引文件行数以使它们保持相对类似可能更有意义。
current_index=0
current_file="${key}_${current_index}"
for key in $unique_key
do
# add key to index file
grep "^${key} " ${input_file} >> "${current_file}"
# check if the max line count is exceeded
line_count=$(wc -l <"${current_file}")
if [ $line_count -ge $max_lines ]
then
# line count exceeded, update index and index file name
current_index=$((current_index+1))
current_file="${key}_${current_index}"
fi
done
我确信这可以做得更短,但我认为对于初学者来说,理解这一点更为重要。