自定义排序多个文件

时间:2015-04-19 02:26:53

标签: bash sorting unix awk cat

我有10个文件(每个1Gb)。文件内容如下:

head -10 part-r-00000

a a a c b   1   
a a a dumbbell  1   
a a a f a   1   
a a a general i 2   
a a a glory 2   
a a a h d   1   
a a a h o   4   
a a a h z   1   
a a a hem hem   1   
a a a k 3   

我需要根据每行的最后一列(降序)对文件进行排序,该行的长度可变。如果数值匹配,则按第二列的字母顺序排序。以下BASH命令适用于小型数据集(不是完整文件),需要3秒钟才能从一个文件中排序10行。

cat part-r-00000 | awk '{print $NF,$0}' | sort -nr | cut -f2- -d' ' > FILE

我希望输出单独FILE。有人可以帮助我加快这个过程吗?

3 个答案:

答案 0 :(得分:2)

不,一旦你摆脱UUOC那么快就会得到它。显然你需要将倒数第二个字段添加到所有内容中,例如类似的东西:

awk '{print $NF,$(NF-1),$0}' part-r-00000 | sort -k1,1nr -k2,2 | cut -f3- -d' '

检查排序参数,我总是和那些混在一起..

答案 1 :(得分:1)

Reverse order,排序和逆序:

awk '{for (i=NF;i>0;i--){printf "%s ",$i};printf "\n"}' file | sort -nr | awk '{for (i=NF;i>0;i--){printf "%s ",$i};printf "\n"}'

输出:

a a a h o 4 
a a a k 3 
a a a general i 2 
a a a glory 2 
a a a h z 1 
a a a hem hem 1 
a a a dumbbell 1 
a a a h d 1 
a a a c b 1 
a a a f a 1 

答案 2 :(得分:1)

您可以使用Schwartzian transform完成任务,

awk '{print -$NF, $(NF-1), $0}' input_file | sort -n | cut -d' ' -f3-
  1. awk命令在每条记录前面加上最后一个字段和第二个字段的负数。

  2. sort -n命令按所需顺序对记录流进行排序,因为我们使用了最后一个字段的否定值。

  3. cut命令拆分空格并剪切前两个字段,即我们用于规范排序的字段

  4. 实施例

    $ echo 'a a a c b   1   
    a a a dumbbell  1   
    a a a f a   1   
    a a a general i 2   
    a a a glory 2   
    a a a h d   1   
    a a a h o   4   
    a a a h z   1   
    a a a hem hem   1   
    a a a k 3' | awk '{print -$NF, $(NF-1), $0}' | sort -n | cut -d' ' -f3-
    a a a h o   4   
    a a a k 3
    a a a glory 2   
    a a a general i 2   
    a a a f a   1   
    a a a c b   1   
    a a a h d   1   
    a a a dumbbell  1   
    a a a hem hem   1   
    a a a h z   1   
    $