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

时间:2015-02-13 15:30:18

标签: bash shell unix awk sed

我有两个文本文件,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 日期进行比较,但这会涉及到我想知道是否可以在使用awksedsort等,没有基本原则的管道中完成。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

你可以试试这个:

paste -d:  <(awk '{print $1,$2,$3}' dates) records | awk -F: '$1!=prev{print $1"\n\t"$2;prev=$1;next} $1==prev{print "\t"$2}'
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
         $1!=prev {print $1"\n\t"$2;prev=$1;next} 

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

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

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