我有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
。有人可以帮助我加快这个过程吗?
答案 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-
awk
命令在每条记录前面加上最后一个字段和第二个字段的负数。
sort -n
命令按所需顺序对记录流进行排序,因为我们使用了最后一个字段的否定值。
cut
命令拆分空格并剪切前两个字段,即我们用于规范排序的字段
$ 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
$