我有一个名为的文件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'