如果不匹配模式,awk向上移动队列

如果不匹配模式,awk向上移动队列,awk,Awk,我不熟悉awk和sed。我有以下几行,如果它与模式不匹配,我想将该行向上移动 文件: 。。。事情就是这样 要使用模式匹配“公司名称”。如果该行没有“公司名称”,请将该行上移 期望输出: company name, address line, city, state, zip, extra info company name, address line, city, state, zip, extra info company name, address line, city, state, zi

我不熟悉
awk
sed
。我有以下几行,如果它与模式不匹配,我想将该行向上移动

文件:

。。。事情就是这样

要使用模式匹配“公司名称”。如果该行没有“公司名称”,请将该行上移

期望输出:

company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info
。。。然后继续


感谢您的帮助

这里告诉我们如何使用
awk

awk '{printf "%s"(NR%4?", ":RS),$0}' file
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info
对于每个
4
行,使用
RS
,否则使用


或者正如Jaypal所建议的:

awk '{ORS=(NR%4?", ":RS)}1' file

这里告诉我们如何使用
awk

awk '{printf "%s"(NR%4?", ":RS),$0}' file
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info
对于每个
4
行,使用
RS
,否则使用


或者正如Jaypal所建议的:

awk '{ORS=(NR%4?", ":RS)}1' file
是一个很好的工具(假设您可以使用
作为分隔符,而不是
后跟空格)

是一个很好的工具(假设您可以使用
作为分隔符,而不是
后跟空格)


您也可以尝试此
awk
命令

awk 'BEGIN{RS="company"}{ gsub (/\n/,", ");} NR>=2 {sub (/, $/,""); print RS$0}' file
示例:

$ cat file
company name
address line
city, state, zip
extra info
company name
address line
city, state, zip
extra info
company name
address line
city, state, zip
extra info

$ awk 'BEGIN{RS="company"}{ gsub (/\n/,", ");} NR>=2 {sub (/, $/,""); print RS$0}' file
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info

您也可以尝试此
awk
命令

awk 'BEGIN{RS="company"}{ gsub (/\n/,", ");} NR>=2 {sub (/, $/,""); print RS$0}' file
示例:

$ cat file
company name
address line
city, state, zip
extra info
company name
address line
city, state, zip
extra info
company name
address line
city, state, zip
extra info

$ awk 'BEGIN{RS="company"}{ gsub (/\n/,", ");} NR>=2 {sub (/, $/,""); print RS$0}' file
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info
company name, address line, city, state, zip, extra info

您是否尝试过将整个文件压缩到一行,然后在
公司名称
之前添加换行符?您是否尝试过将整个文件压缩到一行,然后在
公司名称
之前添加换行符?或者
awk'{ORS=(NR%4?,“:RS)}1'文件
@jaypal真不错!!或者
awk'{ORS=(NR%4?,“:RS)}1'文件
@jaypal真不错!!您可能希望使用multi-char
RS
添加,这样就可以只使用GNU
awk
。Avinash的答案效果最好。请欣赏其他示例,因为在我的示例中,每X行可能不起作用,因为行分隔符在3、4和5之间变化。但这是另一种情况。在另一个文件中,每个文件都有引号。示例“公司名称”“地址行”等,此解决方案失败。如何修改,使模式为“company”,而不是company。Thanks@user3616577,您可能想查看Ed Morton的晶圆厂解决方案。关于avinash的回答,我还有一个问题。我有另一个类似的文件,它的第一行以1开头。somedes#678后跟行地址等2。还有一些#763后跟行地址等。我需要用DesCode#678后跟地址等替换序列化的数字。我还将此作为一个单独的问题发布。再次感谢您的帮助。您可能希望使用multi-char
RS
添加,这使GNU
awk
仅适用于此。Avinash的答案效果最好。请欣赏其他示例,因为在我的示例中,每X行可能不起作用,因为行分隔符在3、4和5之间变化。但这是另一种情况。在另一个文件中,每个文件都有引号。示例“公司名称”“地址行”等,此解决方案失败。如何修改,使模式为“company”,而不是company。Thanks@user3616577,您可能想查看Ed Morton的晶圆厂解决方案。关于avinash的回答,我还有一个问题。我有另一个类似的文件,它的第一行以1开头。somedes#678后跟行地址等2。还有一些#763后跟行地址等。我需要用DesCode#678后跟地址等替换序列化的数字。我还将此作为一个单独的问题发布。再次感谢你的帮助