在文件中追加一行缺少单词的文件

在文件中追加一行缺少单词的文件

我有一个名为的文件xyz.txt,它包含三行,例如

I am ok.
I am fine.
all good.

我需要找到一行不包含am并将该行附加到上一行

对于给定的示例,我需要的输出是

I am ok.
I am fine. all good.

而且该脚本还需要适用于大尺寸文件。例如,如果文件中有 10 行,并且第 3 行和第 7 行缺少“am”,则第 3 行应附加到第 2 行,第 7 行应附加到第 6 行。

答案1

awk解决方案(这里假设 GNU 或 busyboxawk用于\<,\>字边界运算符):

扩展样本file

I am ok.
I am fine.
all good.
am I sleeping?
how's that
I am sure
about that
and think on.
For that I am now

awk '{ printf "%s%s",(NR==1? "": (!/\<am\>/? OFS:ORS)),$0 }END{ print "" }' file
  • "%s%s"- 具有 2 种规格的格式字符串。其中第一个%s是潜在项目“前导”分隔符:
    • 对于第一个记录 ( NR==1) 它将是""(空字符串)
    • 对于不包含am单词的记录 - OFS(输出字段分隔符,即空格)
    • 对于包含am单词 - 的记录ORS(输出记录分隔符,即默认换行符)

输出:

I am ok.
I am fine. all good.
am I sleeping? how's that
I am sure about that and think on.
For that I am now

答案2

sed

sed -e ':a' -e 'N;/\n.*am/!s/\n/ /;ta' -e 'P;D'

解释:

  • 追加N下一行(或打印最后一行并结束)
  • 如果第二行不包含am(尾随!否定地址模式\n.*am),则用空格替换换行符
  • 如果进行了此替换,则循环到开头以在必要时附加另一行(ta是到 mark 的条件跳转:a
  • 如果第二行包含am(未进行替换),则P;D打印第一行并从第二行开始

我明白了,你好像用的是linux。使用 GNUsed你可以简单地写

sed ':a;N;/\n.*am/!s/\n/ /;ta;P;D'

相关内容