使用 awk 无法仅输出模式匹配后的最后一条记录。
每个“记录”都以 DATE 开头,以虚线结尾。
我尝试过以下操作但没有运气。
awk '/02\/21\/19/,/---/; END{print}' sample.file
但这只是给了我所有记录,而不是我所期望的最后一个。
示例数据:我将其称为两个完整记录。我在任何特定时间只需要最后一个。
02/21/19 14:00:00 - 15:00:00
Total:
ID Total Approved Rejected
All 1 0 ( 0%) 1 (100%)
Total By Consumer:
ID Total Approved Rejected
123 1 0 ( 0%) 1 (100%)
Total By Supply:
ID Total Approved Rejected
3878 1 0 ( 0%) 1 (100%)
--------------------------------------------------------
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
还认为 sed 可能有效,但仍然出现错误:
sed -n '/02\/21\/19/,/----/,$p'
sed: -e expression #1, char 20: unknown command: `,'
预期输出是最后一条记录:
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
有任何想法吗?
答案1
如果您的记录由行分隔---
并且您想打印提供的日期的最后一个,您可以使用类似
awk -v RS='\n-+' -v d='02/21/19' '$1 == d {x = $0} END {print x}'
前任。
$ awk -v RS='\n-+' -v d='02/21/19' '$1 == d {x = $0} END {print x}' data
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
如果您有 GNU awk,并且想要保留记录分隔符,请更改x = $0
为x = $0 RT
答案2
在您的命令中,您指定了模式匹配 '/02/21/19,其中也包括第一部分和最后一部分,因此它打印了这两个部分
我尝试了以下两种方法,效果很好
method1: awk '/^02\/21\/19 15/,/-------/{print $0}' file.txt
method2:sed -n '/02\/21\/19 15/,/---/p' file.txt
output
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
答案3
您的第一个sed
命令几乎可以达到目的,但它有语法错误。如果您想要最后一部分,可以这样做:
sed -n '/02\/21\/19 15:00:00 - 16:00:00/,/190/p' file.txt
输出:
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
1)-n
告诉sed
不要自动打印全部内容。
2) 正斜杠内的模式是需要匹配的。我将数据和时间放在一起作为第一个字符串,因为日期本身出现在文件中的其他位置,并且时间也可能出现,因为您提供的是示例数据。然后我将 190 作为第二个要匹配的模式,因为它出现的第一个位置就在虚线之前。
答案4
假设您只想要输入数据中的最后一条记录:
$ awk '/\// { lines = $0; next } { lines = lines ORS $0 } END { print lines }' file
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
这会累积变量中的输入行lines
。每当找到匹配的行/
(一种非常简单的检测保存日期的行的方法)时,累积的行将被清除并仅设置为当前行,然后我们跳到下一个周期。最后输出当前累计行数。
使用等效的东西sed
:
$ sed -n '/\//{x;d;}; H; ${x;p;}' file
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
这一步步与awk
解决方案的变体相同,但使用保留空间而不是变量来累积每个记录的行。