Bash 复制包含单个单词的行并将其粘贴到下面的行?

Bash 复制包含单个单词的行并将其粘贴到下面的行?,bash,awk,sed,Bash,Awk,Sed,请查看下面的示例了解详细信息,其中多个单词是用单行单词粘贴的 word1 multiple word hello hi multiple word hi bye multiple word ok done word2 multiple word ok bye multiple word sldfjkdfs sd f word3 multiple word 作为需要 word1 multiple word hello hi word1 multiple word hi bye word1 mul

请查看下面的示例了解详细信息,其中多个单词是用单行单词粘贴的

word1
multiple word hello hi
multiple word hi bye
multiple word ok done
word2
multiple word ok bye
multiple word sldfjkdfs sd f
word3
multiple word
作为需要

word1 multiple word hello hi
word1 multiple word hi bye
word1 multiple word ok done
word2 multiple word djsfsj sd fafd
word2 multiple word sldfjkdfs sd f
word3 multiple word 
awk
解决方案:

awk 'NF==1{lastword=$1}NF>1{print lastword,$0}' file
#=> word1 multiple word hello hi
#=> word1 multiple word hi bye
#=> word1 multiple word ok done
#=> word2 multiple word ok bye
#=> word2 multiple word sldfjkdfs sd f
#=> word3 multiple word
NF
表示列编号(此处的单词编号),
lastword
保存单个单词。
NF>1
表示有多个单词

sed
解决方案(GNU-sed):

它使用
保留空间
来存储单个单词
然后附加到多个单词行并切换。
h
用图案空间覆盖保留空间的内容。
G
将保留空间的内容追加到模式空间, 用换行符分隔它们

awk
解决方案:

awk 'NF==1{lastword=$1}NF>1{print lastword,$0}' file
#=> word1 multiple word hello hi
#=> word1 multiple word hi bye
#=> word1 multiple word ok done
#=> word2 multiple word ok bye
#=> word2 multiple word sldfjkdfs sd f
#=> word3 multiple word
NF
表示列编号(此处的单词编号),
lastword
保存单个单词。
NF>1
表示有多个单词

sed
解决方案(GNU-sed):

它使用
保留空间
来存储单个单词
然后附加到多个单词行并切换。
h
用图案空间覆盖保留空间的内容。
G
将保留空间的内容追加到模式空间, 用换行符分隔它们。

这可能适合您(GNU-sed):

这可能适用于您(GNU-sed):


下面是Perl解决方案

/tmp> cat vgrs.txt
word1
multiple word hello hi
multiple word hi bye
multiple word ok done
word2
multiple word ok bye
multiple word sldfjkdfs sd f
word3
multiple word
/tmp> perl -lne  ' /^(\S+)$/ and $x=$1 ; print "$x $_" if /\s/ ' vgrs.txt
word1 multiple word hello hi
word1 multiple word hi bye
word1 multiple word ok done
word2 multiple word ok bye
word2 multiple word sldfjkdfs sd f
word3 multiple word
/tmp>

下面是Perl解决方案

/tmp> cat vgrs.txt
word1
multiple word hello hi
multiple word hi bye
multiple word ok done
word2
multiple word ok bye
multiple word sldfjkdfs sd f
word3
multiple word
/tmp> perl -lne  ' /^(\S+)$/ and $x=$1 ; print "$x $_" if /\s/ ' vgrs.txt
word1 multiple word hello hi
word1 multiple word hi bye
word1 multiple word ok done
word2 multiple word ok bye
word2 multiple word sldfjkdfs sd f
word3 multiple word
/tmp>
/tmp> cat vgrs.txt
word1
multiple word hello hi
multiple word hi bye
multiple word ok done
word2
multiple word ok bye
multiple word sldfjkdfs sd f
word3
multiple word
/tmp> perl -lne  ' /^(\S+)$/ and $x=$1 ; print "$x $_" if /\s/ ' vgrs.txt
word1 multiple word hello hi
word1 multiple word hi bye
word1 multiple word ok done
word2 multiple word ok bye
word2 multiple word sldfjkdfs sd f
word3 multiple word
/tmp>