使用标准 UNIX 实用程序 sed、awk、sort 等按日期对 shell 中的记录进行排序
Sort records by date in shell using standard UNIX utilities sed, awk, sort, etc
我有两个文本文件,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
等 without[=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=}'
我有两个文本文件,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
等 without[=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=}'