Arrays 将单个字符串上移到上一行

Arrays 将单个字符串上移到上一行,arrays,linux,bash,if-statement,awk,Arrays,Linux,Bash,If Statement,Awk,我已经试着解决一个问题好几个小时了,但还没有找到解决办法。我试图重新格式化一个被错误解析的文本文件。该文件格式包含一个名称列表,首先从姓氏开始,并且在其中一行上有一个麻烦的唯一姓氏,如下所示: Mussen, Steven Fletcher, Bob Monday, Mario Glitch, Christopher Fletcher, Bob Ram, Dale Ram, Dale Mussen, Steven Von Hemie, Donnie Gallape, Pat

我已经试着解决一个问题好几个小时了,但还没有找到解决办法。我试图重新格式化一个被错误解析的文本文件。该文件格式包含一个名称列表,首先从姓氏开始,并且在其中一行上有一个麻烦的唯一姓氏,如下所示:

 Mussen, Steven
 Fletcher, Bob
 Monday, Mario
 Glitch, Christopher
 Fletcher, Bob
 Ram, Dale
 Ram,
 Dale
 Mussen, Steven
 Von Hemie, Donnie
 Gallape, Patrick
 Desormore, J.
 Sun, Dallas
 Sun, Dallas
我已尝试通过执行以下操作将文件转储到bash数组中:

declare -a GAMERS=($(cat Gamers.txt))"
然后运行for循环:

for i in "${GAMERS[@]}";do echo $i >>NewGamers.txt; done; 
每行一个字。然后,我尝试使用awk将每两行合并为一行:

awk 'NR%2{printf $0" ";next;}1' NewGamers.txt
问题是Donnie Von Hemie先生的名字中有三个字符串,这使得我的awk解决方案毫无用处。最终的目标是简单地解决错误的格式,在本例中,我试图将唯一的Dale向上移动一行。最终输出应为:

Mussen, Steven
Fletcher, Bob
Monday, Mario
Glitch, Christopher
Fletcher, Bob
Ram, Dale
Ram, Dale
Mussen, Steven
Von Hemie, Donnie
Gallape, Patrick
Desormore, J.
Sun, Dallas
Sun, Dallas

如果您有任何想法,我们将不胜感激……

您可以保持简单并使用awk:

awk -F ' *, *' '!$2{if (!p) p=$0; else { print p, $0; p=""} next} 1' file

Mussen, Steven
Fletcher, Bob
Monday, Mario
Glitch, Christopher
Fletcher, Bob
Ram, Dale
Ram, Dale
Mussen, Steven
Von Hemie, Donnie
Gallape, Patrick
Desormore, J.
Sun, Dallas
Sun, Dallas

如果你可以在逗号后面加空格,那么在regexp:
/,\s*$/
/,[:space:]*$/

中,在逗号后面加上
\s
(带gawk)或
[:space:]*$/

谢谢你的快速回复..你给了我一些新东西要学习..awk If else语句。
$ awk '/,$/{p=$0; next} {print p $0; p=""}' file
 Mussen, Steven
 Fletcher, Bob
 Monday, Mario
 Glitch, Christopher
 Fletcher, Bob
 Ram, Dale
 Ram, Dale
 Mussen, Steven
 Von Hemie, Donnie
 Gallape, Patrick
 Desormore, J.
 Sun, Dallas
 Sun, Dallas