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 中进行替换,然后打印结果。
我设法创建了一个文件,现在需要对其进行格式化以进行 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 中进行替换,然后打印结果。