【问题标题】:move single string up into previous row将单个字符串向上移动到上一行
【发布时间】:2016-10-22 21:33:30
【问题描述】:

我已经尝试解决一个问题好几个小时了,但没有找到解决方案。我正在尝试重新格式化已被错误解析的文本文件。该文件格式包含一个名称列表,从姓氏在前,并且在其中一行中有一个麻烦的唯一名字,如下所示:

 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

任何想法都将不胜感激......

【问题讨论】:

    标签: arrays linux bash if-statement awk


    【解决方案1】:

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

    【讨论】:

    • 感谢您的快速回复。您让我学到了一些新东西...awk if-else 语句。
    【解决方案2】:
    $ 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(带gawk)或[[:space:]]/,\s*$//,[[:space:]]*$/

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多