代码之家  ›  专栏  ›  技术社区  ›  J. Smith

Shell脚本排序列表

  •  2
  • J. Smith  · 技术社区  · 16 年前

    VIP NAME DATE  ARRIVE_TIME FLIGHT_TIME
    
    1  USER1 11-02    20.00    21.00
    3  USER2 11-02    20.45    21.45
    4  USER2 11-03    20.00    21.30
    2  USER1 11-04    17.20    19.10
    

    ARRIVE_TIME FLIGHT_TIME 对于同一天的VIP 1,应删除此行,因此 VIP 到达时间 , DATE

    2 回复  |  直到 16 年前
        1
  •  2
  •   Dennis Williamson    16 年前

    您可以使用unix sort命令来执行此操作:

    有一个如何设置主键和次键等的示例:

    Example

    uniq命令是删除重复项所需的命令。

        2
  •  1
  •   Dennis Williamson    16 年前

    这可能会让你开始:

    • 我忽略了标题行。你可以用 head for 循环。
    • 按日期、到达、出发和贵宾编号对航班进行排序——将贵宾编号作为排序键简化了以后的逻辑。
    • 我将结果保存在数组中,但您可以将其重定向到临时文件,并使用 while read line; do ...; done <tempfile 循环。
    • 我使用间接方式使内容更具可读性(命名字段而不是直接使用数组索引——感叹号在这里意味着间接而不是“不”)
    • 对于结果中与最近日期相同的每一行 印刷的 行,将其到达时间与前一航班的出发时间进行比较
    • 保存日期和出发时间以供以后比较。
    • 你应该调整 < 比较一下 <=

    以下是脚本:

    #!/bin/bash
    saveIFS="$IFS"
    IFS=$'\n'
    flights=($(sort -k3,3 -k4,4n -k5,5n -k1,1n flights ))
    IFS="$saveIFS"
    
    date=fields[2]
    arrive=fields[3]
    depart=fields[4]
    
    for line in "${flights[@]}"
    do
        fields=($line)
        if [[ ${!date} == $prevdate && ${!arrive} < $prevdep ]]
        then
            echo "deleted: $line"    # or you could do something else here
        else
            echo $line
            prevdep=${!depart}
            prevdate=${!date}
        fi
    done