首页 > 解决方案 > 找到一个单词的一行并将其与下一行合并

问题描述

我有一个无法解决的 grep 问题。

我有什么。名字和姓氏的列表,例如:

John Doe
Alice Smith
Bob Smith

我的问题。有时,名字和姓氏是脱节的,例如:

Alice
Smith
Bob Doolittle
Mark
Von Doe //sometimes, there are more than one word on the next line

我想达到什么。将“孤儿”名称与下一行连接起来。

Alice Smith
Bod Doolittle
Mark Von Doe

我已经尝试过的

grep -ozP "^\w+\n\w.+" file | tr '\n' ' '

所以,在这里我要求 grep 找到只有一个单词的行并将其与下一行连接,即使下一行有多个单词。

它可以正常工作,但前提是孤立的单词位于文件的最开头。如果它出现在第一行下方,则 grep 不要发现它。所以一个快速而肮脏的解决方案,我会循环遍历文件并在每次通过后删除一行对我来说不起作用。

标签: shellawksedgreptr

解决方案


如果awk可以接受:

awk '
NF==1 {printf "%s ",$1; getline; print; next}
1' names.dat

在哪里:

  • NF==1- 如果当前记录中只有一个名称/字段...
  • printf / getline / print / next- 打印字段#1,读取下一行并打印,然后跳到下一行
  • 1- 按原样打印所有其他行

作为一个单行:

awk 'NF==1{printf "%s ",$1;getline;print;next}1' names.dat

这会产生:

Alice Smith
Bob Doolittle
Mark Von Doe //sometimes, there are more than one word on the next line

推荐阅读