排序此列表时如何忽略“吉隆坡”中的空格?我通过选择列并在选项卡上排序来欺骗它,这给了我正确的结果,但我想知道如何处理列中的空格,因为重新格式化列表似乎不是一个好习惯,特别是当列表更大时。
提前致谢
Kuala Lumpur 78 56
Seoul 86 66
Karachi 95 75
Tokyo 85 60
Lahore 85 75
Manila 90 85
按城市:
Karachi 95 75
Kuala Lumpur 78 56
Lahore 85 75
Manila 90 85
Seoul 86 66
Tokyo 85 60
我还按高温(高-低,第二列)和低温(低-高,第三列)排序
按高温:
Karachi 95 75
Manila 90 85
Seoul 86 66
Lahore 85 75
Tokyo 85 60
Kuala Lumpur 78 56
按低温:
Kuala Lumpur 78 56
Tokyo 85 60
Seoul 86 66
Karachi 95 75
Lahore 85 75
Manila 90 85
答案1
1)通过命令将空格转换为制表符unexpand
(考虑每8个空格是一个制表符)
TAB
2)以这种方式使用带分隔符的排序:
TAB=`echo -e "\t"`
sort -t"$TAB" YOUR_FILE
答案2
注意:-您的问题已更改两次,但我无法一次又一次更改答案,但希望通知您答案将保持不变,您只需使用-k2
其中 2 是列对列号进行排序,然后您就会得到正确的答案。
刚刚使用 sort + sed
按城市
sort -k1 input_data | sed '/^$/d; s/$/\n/'
按高温:
sort -k2 -nr data | sed '/^$/d; s/$/\n/'
按低温:
sort -k4 -nr data | sed '/^$/d; s/$/\n/'
解释:
排序后的数据将发送到 sed
然后 sed 将使用删除第一个空白行,/^$/d
然后在每行后附加新行。
答案3
你有两个选择。
创建一个新的可排序名称列,并删除空格,按此临时/新列排序,然后最终抑制此“临时”列的输出,或者
确保字段分隔符在任何字段中都不是有效字符。空格是城市名称中的有效字符,因此您必须使用其他字符作为字段分隔符。
选项 1 允许您进行更多控制,因为您可以用任何其他名称替换名称,例如全部小写、删除数字、将字符转换为其他字符等等,但实现起来也更复杂。
选项2可以这样完成:
#!/bin/bash
awk '{TLOW=$(NF-1);
THIGH=$NF;
$NF="";
$(NF-1)="";
gsub(" +$","");
CITYNM=$0;
printf ("%s:%s:%s\n", CITYNM, TLOW, THIGH)}' | sort -t:
现在的问题是如何对“Cape Town”和“Capelle”这样的名称进行排序。 unix 排序命令将 Capelle 置于 Cape Town 之前,但这可能有时不是你想要的,这就是选项 1 发挥作用的时候。