我需要按名称、高温和低温对此列表进行排序:
Kuala Lumpur 78 56
Seoul 85 66
Karachi 95 75
Tokyo 85 60
Lahore 85 75
Manila 90 85
Run Code Online (Sandbox Code Playgroud)
我想既然空格是列的分隔符,我可以
sort -k 1
给我这个:
Karachi 95 75
Kuala Lumpur 78 56
Lahore 85 75
Manila 90 85
Seoul 85 66
Tokyo 85 60
Run Code Online (Sandbox Code Playgroud)
但“吉隆坡”却因空间问题而引发问题。
所以我尝试将“Lumpur”视为一列并对我所做的第一组数字进行排序
sort -k 3n
Run Code Online (Sandbox Code Playgroud)
但我明白了:
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
Run Code Online (Sandbox Code Playgroud)
我该如何处理这一空间?
正如其他人评论的那样,如果数据是逗号分隔值 (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
Run Code Online (Sandbox Code Playgroud)
它将数字前面的任何空格替换为逗号。\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
Run Code Online (Sandbox Code Playgroud)
如果您想转换回空格或制作表格,这里有两个示例:
$ 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
Run Code Online (Sandbox Code Playgroud)
awk '{print $NF,$0}' file.txt | sort -nr -k1 | cut -d' ' -f2-
Run Code Online (Sandbox Code Playgroud)
$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
Run Code Online (Sandbox Code Playgroud)
readlines = ARGF.readlinessplit默认按空格分割