awk - 如何使用 sed 从由空行分隔的文件部分打印某些行
问题描述
我一直在尝试提出一个 sed 命令,该命令将从文件中由空白行分隔的文本块中提取某些行。文本块如下。
# cat test_file.txt
line 1
line 2
line 3
line 4
line 5
line 1
line 2
line 3
line 4
line 5
line 1
line 2
line 3
line 4
line 5
我试图从每个块中拉出第 2 行和第 4 行,因此输出将如下所示。
line 2
line 4
line 2
line 4
line 2
line 4
我想出了一种方法来使用 sed 处理第一块文本:
# sed -n -e 2p -e 4p test_flie.txt
line 2
line 4
但是一直无法找到一种方法让它继续为每个文本块直到文件末尾。任何指针将不胜感激。
解决方案
awks 段落模式专门用于处理空白行分隔的记录/文本块,就像您正在处理的那样:
$ awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} {print $2, $4}' file
line 2
line 4
line 2
line 4
line 2
line 4
参考POSIX 标准:
<newline>
如果 RS 为空,则记录由一个或多个空行组成的序列分隔,前导或尾随空行不应导致输入的开头或结尾处为空记录
如果您不需要在最终记录后打印空行:
$ awk 'BEGIN{RS=""; FS=OFS="\n"} NR>1{print prev ORS} {prev=$2 OFS $4} END{print prev}' file
line 2
line 4
line 2
line 4
line 2
line 4
或者如果您出于某种原因不想使用段落模式,那么:
$ awk 'BEGIN{tgts[2]; tgts[4]} !NF{print ""; lineNr=0; next} ++lineNr in tgts' file
line 2
line 4
line 2
line 4
line 2
line 4
推荐阅读
- c# - 禁用 chrome 作为多进程。Chrome 版本 68 无法捕获 URL
- facebook - 无法读取未定义的属性“logInWithReadPermissions”,但存在 LoginManager
- jpa - 为什么在看到 PersistentBag 的实体中使用 JPA 列出(@OneToMany)
- jquery - Bootsrap 菜单锚点仅在滚动到部分中间后激活
- android - 是否可以使用 IMPORTANCE_DEFAULT 创建一个通知频道(奥利奥),但不会播放任何声音?
- python - 如何使用 pybabel 获取特定语言的翻译
- angular - 添加图层组以按名称进行映射和更新
- postgresql - 如何在 PostgreSQL 中找出碎片索引并对其进行碎片整理?
- java - 从 ANTLR 中的语法规则调用方法?
- git - Git GPG 签名失败,没有明确的消息