Bash Awk或Sed连接多个用空行分隔的行
我设法创建了一个文件,现在需要格式化以进行csv导入: 以下是一些记录:Bash Awk或Sed连接多个用空行分隔的行,bash,awk,sed,Bash,Awk,Sed,我设法创建了一个文件,现在需要格式化以进行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 Na
(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=$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
一个简短的
awk
解决方案(在末尾提供一个额外的,
)
这可能适用于您(GNU-sed):
除非换行符以空格开头,否则请用逗号替换换行符,在这种情况下,请删除逗号后面的空格,并将前一行打印为空行
gsed -n 'H;/^$/h;/ZIP$/x;s/^\n//;s/\n/,/gp' file
- -n
关闭图案空间默认打印 - H
当前行附加到保留空间 - /ZIP$/x
当当前行有“ZIP”关键字时,交换保留空间和模式空间现在模式空间有一条“ZIP”线,而这条“ZIP”线已经通过命令“H”附加到保留空间,我们必须在下一圈之前清空保留空间李> - /^$/h 当遇到空行时,图案空间附加到保留空间,它将清空保留空间
- s/\n/,/gp 在图案空间中进行替换,然后打印结果
sed -r ':a;$!N;s/\n(\S)/,\1/;ta;s/,\s+/,/g;P;d' file
gsed -n 'H;/^$/h;/ZIP$/x;s/^\n//;s/\n/,/gp' file