【问题标题】:Awk or Sed to join multiple lines separated with blank lineawk 或 Sed 连接多行,用空行分隔
【发布时间】:2017-04-19 02:10:11
【问题描述】:

我设法创建了一个文件,现在需要为 csv 导入格式化:

以下是一些记录:

(202) 111-0000
1
Full Name
Street Address
City, State ZIP

(212) 222-9999
2
Full Name
Street Address
City, State ZIP

(312) 888-2222
3
Full Name
Street Address
City, State ZIP

我希望转换成这个:

(202) 111-0000,1,Full Name,Street Address,City,State,ZIP
(212) 222-9999,2,Full Name,Street Address,City,State,ZIP
(312) 888-2222,3,Full Name,Street Address,City,State,ZIP

注意 City State 和 ZIP 如何在所需输出中正确地用逗号分隔。

任何 awk 或 sed 专家愿意帮助我解决这个问题?

非常感谢。

【问题讨论】:

  • 你试过自己做吗?你遇到了什么问题?请展示研究/努力,以便 SO 用户可以提供帮助。
  • 嗨。在等待通知时,我确实设法自己(以一种非常丑陋的方式)做到了这一点 - 一个小时前,我在一封电子邮件中收到了所有 4 个答案。

标签: bash awk sed


【解决方案1】:

这可能对你有用(GNU sed):

sed -r ':a;$!N;s/\n(\S)/,\1/;ta;s/,\s+/,/g;P;d' file

用逗号替换换行符,除非该行以空格开头,在这种情况下,删除逗号后面的所有空格并打印前行放弃空行。

【讨论】:

    【解决方案2】:

    我假设您可以访问 GNU awk 和 sed。

    为了正确获取 ZIP 部分,我们将其用作示例输入:

    $ cat file
    (202) 111-0000
    1
    Full Name
    Street Address
    City, State 10023
    
    (212) 222-9999
    2
    Full Name
    Street Address
    City, State 10023
    
    (312) 888-2222
    3
    Full Name
    Street Address
    City, State 10023
    

    我们可以将其转置如下:

    $ awk -v RS="" -F'\n' -v OFS=, '{$1=$1} 1' file | sed -r 's/ +([[:digit:]-]+)$/, \1/'
    (202) 111-0000,1,Full Name,Street Address,City, State, 10023
    (212) 222-9999,2,Full Name,Street Address,City, State, 10023
    (312) 888-2222,3,Full Name,Street Address,City, State, 10023
    

    消除多余的空格

    如果上面的多余空格有问题,请尝试:

    $ awk -v RS="" -F'\n' -v OFS=, '{$1=$1} 1' file | sed -r 's/ +([[:digit:]-]+)$/, \1/; s/, +/,/g'
    (202) 111-0000,1,Full Name,Street Address,City,State,10023
    (212) 222-9999,2,Full Name,Street Address,City,State,10023
    (312) 888-2222,3,Full Name,Street Address,City,State,10023
    

    【讨论】:

      【解决方案3】:

      一个简短的awk 解决方案(最后给出一个额外的,

      awk 'NR%6==5 {gsub(/,? /,",")} ORS=NR%6?",":RS' file
      (202) 111-0000,1,Full Name,Street Address,City,State,ZIP,
      (212) 222-9999,2,Full Name,Street Address,City,State,ZIP,
      (312) 888-2222,3,Full Name,Street Address,City,State,ZIP,
      

      【讨论】:

        【解决方案4】:
        gsed -n 'H;/^$/h;/ZIP$/x;s/^\n//;s/\n/,/gp' file
        
        • -n
          关闭模式空间默认打印。
        • H
          当前行追加以保留空间。
        • /ZIP$/x
          当前行有 "ZIP" 关键字时,交换保持空间和模式空间。 现在模式空间有一个 "ZIP" 行,并且这个 "ZIP" 行已经通过命令 'H'追加到保持空间>,我们必须在下一个圈之前清空保持空间
        • /^$/h 当遇到空行时,模式空间追加到保持空间,它将清空保持空间。
        • s/\n/,/gp 在模式空间中进行替换,然后打印结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-12
          • 2017-09-02
          • 2011-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多