Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Awk或Sed连接多个用空行分隔的行_Bash_Awk_Sed - Fatal编程技术网

Bash Awk或Sed连接多个用空行分隔的行

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

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

您自己试过吗?你面临的问题是什么?请展示研究/努力,以便用户能够提供帮助。嗨。在等待通知的时候,我自己也做到了(以一种非常丑陋的方式),一小时前,我在一封电子邮件中得到了4个答案。
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