Awk 或 Sed 加入以空行分隔的多行

Awk or Sed to join multiple lines separated with blank line

我设法创建了一个文件,现在需要对其进行格式化以进行 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 专家愿意帮助我解决这个问题?

非常感谢。

我假设您可以使用 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' file | sed -r 's/ +([[:digit:]-]+)$/, /'
(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' file | sed -r 's/ +([[:digit:]-]+)$/, /; 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

一个简短的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,

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

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

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

gsed -n 'H;/^$/h;/ZIP$/x;s/^\n//;s/\n/,/gp' file
  • -n
    关闭模式 space 默认打印。
  • H
    当前行追加到 space.
  • /ZIP$/x
    当当前行有"ZIP"关键字时,交换保持space和模式space。 现在模式 space 有一个 "ZIP" 行,而这个 "ZIP" 行有已经通过命令 'H' 附加到 hold space,我们必须在下一个 circle 之前清空 hold space。
  • /^$/h 当遇到空白行时,模式 space 附加到保留 space,它将清空保留 space.
  • s/\n/,/gp 在模式 space 中进行替换,然后打印结果。