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