我正在尝试检索与文本文件相关的行,但我不确定如何完成它。
以下是.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
答案 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