使用标准 UNIX 实用程序 sed、awk、sort 等按日期对 shell 中的记录进行排序

Sort records by date in shell using standard UNIX utilities sed, awk, sort, etc

我有两个文本文件,recordsdates:

records

a
b
c
d
e

dates

Fri Jul 15 23:20:01
Thu Jul 14 12:03:53
Mon Jul 10 10:11:35
Mon Jul 10 10:11:20
Mon Jul 10 10:11:15

records 中的每一行 匹配 dates 中的一行。这两个文件也始终按时间顺序排序。

我想显示以下内容:

Fri Jul 15
  a

Thu Jul 14
  b

Mon Jul 10
  c
  d
  e

我可以想象一个简单的算法,循环遍历 records 中的每一行,并将 dates 中的相应日期与我检查的 last 日期进行比较,但这会涉及到,我想知道是否可以使用 awksedsortwithout[=41] 在管道中完成=] bashisms.

$ cat tst.awk
NR==FNR {
    sub(/ [0-9:]+$/,"")
    dates[NR] = [=10=]
    next
}
{
    curr = dates[FNR]
    if (curr != prev) {
        print curr
    }
    print "  " [=10=]
    prev = curr
}

$ awk -f tst.awk dates records
Fri Jul 15
  a
Thu Jul 14
  b
Mon Jul 10
  c
  d
  e

你可以试试这个:

paste -d:  <(awk '{print ,,}' dates) records | awk -F: '!=prev{print "\n\t";prev=;next} ==prev{print "\t"}'
Fri Jul 15
    a
Thu Jul 14
    b
Mon Jul 10
    c
    d
    e

解释:

<([command]) :允许我们将 [command] 的输出用作文件

paste -d: <([awk] dates) records :将使用 : 作为分隔符将 awk 命令的输出粘贴到记录文件中 例如:Fri Jul 15:a

最后一个 awk 命令:

awk -F: '
         # If we have not seen date print date,new line,tab and record
         !=prev {print "\n\t";prev=;next} 

         #if we have seen date print tab and record
         ==prev{print "\t"}
        '

正如 Ed Morton 在评论中指出的那样,最后一个 awk 命令可以更短:

awk  -F: '{print (==prev ? "" : "\n") "\t"; prev=}'