shell - 找到一个单词的一行并将其与下一行合并
问题描述
我有一个无法解决的 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 不要发现它。所以一个快速而肮脏的解决方案,我会循环遍历文件并在每次通过后删除一行对我来说不起作用。
解决方案
如果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
推荐阅读
- mongodb - 客户端 JavaScript 中 mongo shell 中的 NumberInt() 等价物是什么?
- python - 是否可以像这样抓取 javascript 图表?
- java - 来自 cassandra 检查的时间戳空值在 java 中失败
- mysql - 从秒转换为时间后截断不正确的时间值
- windows - 如何在多个文件上调用动词
- python - plt.figure() 影响 kivy 窗口?
- python - 对 Spark 数据框中的行进行洗牌
- postgresql - 合并联合中的行,将空列替换为具有值的列
- schema.org - JSON-LD 中的 LocalBusiness 和 Organization 模式
- filter - 需要帮助过滤数据 - Google 表格(见说明)