仅在数据完成时检索多行

时间:2017-08-05 14:08:35

标签: unix awk grep

我正在尝试检索与文本文件相关的行,但我不确定如何完成它。

以下是.txt文件中的示例行。

Name : Alice 
Age : 23
Email : Alice@email.com

Name : John
Age : 24

Name : Peter
Age: 25
Email :Peter@email.com

从上面看,我只对采用Alice和Peter的数据感兴趣,因为John的信息不完整(缺少电子邮件行)。

所以输出应该是:

Name : Alice 
Age : 23
Email : Alice@email.com

Name : Peter
Age: 25
Email :Peter@email.com

5 个答案:

答案 0 :(得分:3)

只需打印包含3行的记录:

$ awk -v RS= -v ORS='\n\n' -F'\n' 'NF==3' file
Name : Alice
Age : 23
Email : Alice@email.com

Name : Peter
Age: 25
Email :Peter@email.com

你甚至可以自动化它来计算每条记录应该有多少行而不是硬编码3

$ awk -v RS= -v ORS='\n\n' -F'\n' 'NR==FNR{m=(NF>m?NF:m);next} NF==m' file file
Name : Alice
Age : 23
Email : Alice@email.com

Name : Peter
Age: 25
Email :Peter@email.com

最后假设您的文件中至少有一条记录已完成。

答案 1 :(得分:1)

使用GNU grep:

grep -Poz '^Name.*\n^Age.*\n^Email.*(\n^$)*' file

输出:

Name : Alice 
Age : 23
Email : Alice@email.com

Name : Peter
Age: 25
Email :Peter@email.com

答案 2 :(得分:1)

您可以使用以下awk命令:

awk '/Name :/&&/Age :/&&/Email :/' RS='' ORS='\n\n' file

关注man awk

  

如果RS设置为空字符串,则记录          由空行分隔。

这使得awk基于记录而非进行操作。 /Name :/&&/Age :/&&/Email :/检查此记录是否包含所有必填字段。如果是这样,awk将打印记录。

答案 3 :(得分:1)

awk 解决方案:

awk '/Name/{ n=$0 }n && /Age/{ a=$0; rn=NR }a && /Email/ && (NR-rn == 1){ print n RS a RS $0 RS }' file

输出:

Name : Alice 
Age : 23
Email : Alice@email.com

Name : Peter
Age: 25
Email :Peter@email.com

答案 4 :(得分:1)

非常简洁的perl:

perl -00 -lne 'print if tr/\n/\n/ == 2' file.txt