awk:将记录设置为模式匹配,然后仅打印最后一条记录

awk:将记录设置为模式匹配,然后仅打印最后一条记录

使用 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 = $0x = $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解决方案的变体相同,但使用保留空间而不是变量来累积每个记录的行。

相关内容