我如何使用awk向前搜索文件并删除与前3行匹配的行

时间:2018-10-24 17:03:17

标签: awk duplicates

由于分页,我有一个文件,如果不能在当前页面上打印数据,则会复制标题行。例如: 高

eading
data1
data2
data3 ...

然后在页面底部:

NEW Heading
Heading line2
Heading line3
; no more room on this page so a new page is generated and duplicates above -
NEW Heading
Heading line2
Heading line3

所以基本上我需要存储3行,向前看3行,如果匹配,则从文件中删除重复的3行

1 个答案:

答案 0 :(得分:0)

AWK无法做善良的前瞻性工作。 AWK是面向流的。

文件示例:

$ cat example
Heading
data1
data2
data3
NEW Heading
Heading line2
Heading line3
NEW Heading
Heading line2
Heading line3

使用关联数组的不干净的AWK(+ sort)hack解决方案:

$ awk '{ if ( arr[$0]=="" ) arr[$0]=NR; } END { for (i in arr) print(arr[i] " " i); }' example | sort -n | awk -F'^[0-9]+ ' '{ print($NF); }'
Heading
data1
data2
data3
NEW Heading
Heading line2
Heading line3
  1. awk将第一行出现的行号分配给关联数组。最后,它打印行号和用空格分隔的行。
  2. sort按数字顺序对输出进行排序
  3. awk用空格分割每个正则表达式并输出原始行

对于干净的GAWK解决方案(在内部使用排序),您可以研究:

https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array-Traversal.html#Controlling-Array-Traversal

https://www.gnu.org/software/gawk/manual/html_node/Array-Sorting-Functions.html#Array-Sorting-Functions