簡體   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