按键分组,文件分区

时间:2018-05-06 15:57:52

标签: shell mapreduce

我正在寻找一种shell方法,以便对文件进行更高效的全局排序操作。特别是,我想根据键的值拆分文件(这样所有以相同键开头的行最终都在同一个文件中)。 (此命令将是第一步,然后对这些分区文件进行排序,例如。)

这可以通过执行类似的操作在文件的单次传递中完成,例如,对密钥进行散列模拟一些与最终分区文件数相对应的参数。

好奇是否有任何命令可以做这样的事情?

(例如,如果键只是单个字符,关键点是"所有" Bs和Ds最终在file1中,所有Ac和Cs最终都在file2等中,以便在对这些文件进行排序后,我们知道所有类似的键都是相互分组的。这里的一个动机是用shell命令演示map-reduce的哈希分区。)

1 个答案:

答案 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

我确信这可以做得更短,但我认为对于初学者来说,理解这一点更为重要。