在第一列中使用不等空格进行排序

在第一列中使用不等空格进行排序

我需要按名称、高温和低温对此列表进行排序:

Kuala Lumpur 78 56
Seoul 85 66
Karachi 95 75
Tokyo 85 60
Lahore 85 75
Manila 90 85

我想既然空格是列的分隔符,我可以 sort -k 1 给我这个:

Karachi         95 75
Kuala Lumpur    78 56
Lahore          85 75
Manila          90 85
Seoul           85 66
Tokyo           85 60

但“吉隆坡”却因空间问题而引发问题。

所以我尝试将“Lumpur”视为一列并对我所做的第一组数字进行排序

sort -k 3n

但我明白了:

Tokyo           85 60
Seoul           85 66
Karachi         95 75
Lahore          85 75
Kuala Lumpur    78 56 <---Why is this out of order?
Manila          90 85

我该如何处理这一空间?

答案1

正如其他人评论的那样,如果数据是逗号分隔值 (CSV),则使用数据会更容易。

这是我将数据转换为 CSV 的解决方案:

$ cat file | sed 's/ \([0-9]\)/,\1/g' 
Kuala Lumpur,78,56
Seoul,85,66
Karachi,95,75
Tokyo,85,60
Lahore,85,75
Manila,90,85

它将数字前面的任何空格替换为逗号。\1引用组 ([0-9]),即空格后面的数字。从那里您可以使用sort参数-t来指定字段分隔符。

$ cat file | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2  
Kuala Lumpur,78,56
Tokyo,85,60
Seoul,85,66
Lahore,85,75
Manila,90,85
Karachi,95,75

如果您想转换回空格或制作表格,这里有两个示例:

$ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | tr , ' '
Kuala Lumpur 78 56
Tokyo 85 60
Seoul 85 66
Lahore 85 75
Manila 90 85
Karachi 95 75

$ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | column -s, -t 
Kuala Lumpur  78  56
Tokyo         85  60
Seoul         85  66
Lahore        85  75
Manila        90  85
Karachi       95  75

答案2

awk '{print $NF,$0}' file.txt | sort -nr -k1 | cut -d' ' -f2-
  • $NF: 字段数,$0: 整行
  • sort -nr:数字反转(降序)
  • sort -k1:按第一列排序(由空格和制表符序列分隔)
  • cut -d:分隔符(默认为制表符)
  • cut -f2-:字段 2 到最后一个(不折叠或去除分隔符)
ruby -e 'puts readlines.sort_by{|l|l.split[-1].to_i}.reverse' file.txt
  • readlines=ARGF.readlines
  • split默认按空格分割

答案3

如果您可以将文件更改为制表符分隔的列,您的生活会更轻松。如果无法更改文件,此 Perl 语句将为您完成此操作:

perl -ne 's/\s+/\t/g; s/([a-z])\s([a-z])/$1 $2/ig; s/\t$/\n/; print;' file |
  sort -t$'\t' -nk3
Kuala Lumpur    78  56  
Tokyo   85  60  
Seoul   85  66  
Karachi 95  75  
Lahore  85  75  
Manila  90  85  

解释:

  • s/\s+/\t/g:将所有空格更改为 TAB。
  • s/([a-z])\s([a-z])/$1 $2/ig:将两个字母(无数字)之间的制表符更改回单个空格。
  • s/\t$/\n/:第一个替换在每行末尾引入一个制表符,将其更改回换行符 ( \n)。

  • sort -t$'\t' -nk3:使用 TAB 作为分隔符(排序有一个奇怪的语法,我知道,请参阅这里了解更多信息)并在第三列上按数字排序。

相关内容