bash 中排序的另一个问题

bash 中排序的另一个问题

排序此列表时如何忽略“吉隆坡”中的空格?我通过选择列并在选项卡上排序来欺骗它,这给了我正确的结果,但我想知道如何处理列中的空格,因为重新格式化列表似乎不是一个好习惯,特别是当列表更大时。

提前致谢

  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个空格是一个制表符)

TAB2)以这种方式使用带分隔符的排序:

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. 确保字段分隔符在任何字段中都不是有效字符。空格是城市名称中的有效字符,因此您必须使用其他字符作为字段分隔符。

选项 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 发挥作用的时候。

相关内容