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