从巨大的文本文件中剥离文本块

Lap*_*rrl 6 awk sed

我的任务非常痛苦,我想知道是否有人可以提供帮助.

我们的供应商提供了一个SNMP mib文件(txt).不幸的是,这个文件很多都已经过时,需要为我们的监控应用程序删除.

我一直在尝试手工完成这项工作,但它已超过800,000行,并且它正在削弱我的生存意愿.

结构类似于:

-- /*********************************************************************************/
-- /* MIB table for Hardware                                                        */
-- /* Valid from: 543.44                                                            */
-- /* Deprecated from: 600.3                                                        */
-- /*********************************************************************************/

Some text 
some text 
Some text

-- /*********************************************************************************/
-- /* MIB table for Hardware                                                        */
-- /* Valid from: 543.44                                                            */
-- /*********************************************************************************/

Some text 
some text 
Some text

-- /*********************************************************************************/
-- /* MIB table for Hardware                                                        */
-- /* Valid from: 364.44                                                            */
-- /* Deprecated from: 594.3                                                        */
-- /*********************************************************************************/
Run Code Online (Sandbox Code Playgroud)

随意重复,恶心

我在想的是一个脚本:

找到文本"Deprecated from"然后

delete that line, 
delete the preceding 3 lines, 
delete the following one line, 
delete then all following lines until the next
"-- /*********************************************************************************/"
Run Code Online (Sandbox Code Playgroud)

这有意义吗?这种事情是可能的,还是我只是在做梦?

谢谢!

Dan*_*ego 3

编辑:我刚刚意识到我读错了你的问题,即使已经被投票了几次。我之前的回复已经失效了!现在应该更正确了,但有一些额外的假设。简单的解决方案只能让您到目前为止!

通过一些假设,这可能可以帮助您:

cat -s data | awk -vFS='\n' -vRS='\n\n' '/Deprecated from/ { getline; next } 1'
Run Code Online (Sandbox Code Playgroud)

cat命令只是为了挤出多余的换行符,因此awk可以更轻松地操作。至于awk-vFS='\n'告诉它字段由换行符分隔,并-vRS='\n\n'告诉它记录由一行中的两个换行符分隔。然后/Deprecated from/查找具有该文本的记录,并{ getline; next }读入其后的下一条记录,并使其继续前进。1是打印到达下一个点的行的快捷方式。

这将假设以下情况

  • 所有注释和文本块两侧至少由一个空行分隔
  • 只有均匀散布的注释块和文本块
  • 文本块内没有空行

所以它可能不太适合你。如果这些假设没问题,那么它awk对于这项工作来说是一个不错的选择,正如您所看到的:脚本很小!

$ cat -s data | awk -vFS='\n' -vRS='\n\n' '/Deprecated from/ { getline; next } 1'
-- /*********************************************************************************/
-- /* MIB table for Hardware                                                        */
-- /* Valid from: 543.44                                                            */
-- /*********************************************************************************/
Some text
some text
Some text
Run Code Online (Sandbox Code Playgroud)

此外,正如您所看到的,剩下的换行符会被推出。为了帮助实现这一点,您可以像这样修改命令:

$ cat -s data | awk -vFS='\n' -vRS='\n\n' '/Deprecated from/ { getline; next } { printf "%s\n\n", $0 }'
-- /*********************************************************************************/
-- /* MIB table for Hardware                                                        */
-- /* Valid from: 543.44                                                            */
-- /*********************************************************************************/

Some text
some text
Some text
Run Code Online (Sandbox Code Playgroud)