将单个字符串移到上一行

时间:2016-06-21 11:01:43

标签: 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, 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

任何想法都会受到欢迎......

2 个答案:

答案 0 :(得分:2)

你可以保持简单并使用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

答案 1 :(得分:0)

$ 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

如果逗号后面有空格,请在正则表达式\s[[:space:]]中添加/,\s*$/(带gawk)或/,[[:space:]]*$/