繁体   English   中英

如何在bash中对行格式特殊的文件进行排序?

[英]how to sort a file in bash whose lines are in a particular format?

file.txt中的所有行均采用以下格式:

player16:level8|2200 Points
player99:level8|19000 Points
player23:level8|260 Points

如何基于点对文件进行排序? 寻找以下输出

player99:level8|19000 Points
player16:level8|2200 Points
player23:level8|260 Points

任何帮助将不胜感激。 谢谢。

sort是为此任务设计的

sort -t'|' -k2nr file

将定界符设置为| 并按第二个字段数字逆序排序

您已将其标记为perl所以我将添加一个完善的答案。

如果根据相对位置返回“正/负/零”,则可以使用perl的sort函数指定任意比较标准。 默认情况下, <=>运算符以数字方式执行此操作,而cmp运算符按字母顺序进行操作。

通过依次将$a$b设置到列表的每个元素,并对每个对执行比较功能来进行sort

因此,对于您的情况-我们制作一个正则表达式匹配每行的函数,并提取点值:

sub sort_by_points {
   #$a and $b are provided by sort. 
   #we regex capture one or more numbers that are followed by "Points". 
   my ($a_points) = $a =~ m/(\d+) Points/;
   my ($b_points) = $b =~ m/(\d+) Points/;
   #we compare the points - note $b comes first, because we're sorting 
   #descending. 
   return $b_points <=> $a_points;
}

然后,通过调用sort使用它。

#!/usr/bin/env perl
use strict;
use warnings;

sub sort_by_points {
   my ($a_points)= $a =~ m/(\d+) Points/;
   my ($b_points) = $b =~ m/(\d+) Points/;
   return $b_points <=> $a_points;
}

#reads from the special __DATA__ filehandle. 
chomp ( my @list = <DATA> ) ;
my @sorted_list = sort {sort_by_points} @list;
print join "\n", @sorted_list;

__DATA__
player16:level8|2200 Points
player99:level8|19000 Points
player23:level8|260 Points

就您的目的而言,您可以使用<>作为输入,因为这是魔术文件句柄-命令行中的参数,或通过STDIN传递的数据(可能听起来很奇怪,但这与sed / grep / awk一样)

如果您要求Perl解决方案:

perl -F'\|' -e'push@a,[$_,$F[1]]}{print$_->[0]for sort{$b->[1]<=>$a->[1]}@a' file.txt

但是使用sort要简单得多

sort -t'|' -k2nr file.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM