首页 > 解决方案 > 只打印多个行块

问题描述

输入由许多行块组成,由空行分隔我需要在打印中删除单行块剩余的 >1 行块

示例输入:

block1

block2
block2
block2

block3

block4
block4

block5

block6
block6

预期输出:

block2
block2
block2

block4
block4

block6
block6

标签: bashawksed

解决方案


这可以通过重新定义字段分隔符和记录分隔符使用轻松完成。

首先,重要的是要认识到的两个最重要的概念是记录字段

stdin通过各种方式(或)输入 awk 的输入被逐条getline读取,其中每条记录由定义的记录分隔符分隔RS。由于RS默认情况下是 <newline> 字符\n,因此记录实际上是一行,因此 awk 会逐行处理默认文件。

当读取记录/行时,awk 会将记录拆分为字段,其中每个字段由字段分隔符FS(可以是正则表达式)分隔。默认情况下,字段分隔符FS设置为任何 <blank> 字符序列。这意味着,默认情况下,每个字段都是一个单词。如果重新定义FS,字段会有所不同。

一个特殊的记录分隔符是空的RS="",因为它定义了RSFS

如果RS为 null,则记录由 <newline> 加上一个或多个空行组成的序列分隔,前导或尾随空行不应导致输入的开头或结尾处为空记录,并且 <newline> 应始终是一个字段分隔符,不管 的值FS是什么。

来源:awk POSIX 标准

因此,您可以执行以下操作:

awk 'BEGIN{RS="";ORS="\n\n"}(NF>1)' file

推荐阅读