您好,我正在寻找有关如何使用 sed 格式化文件的帮助。
我有一个生成的文件,如下所示:
projectA
email1@demo.com
Email2@test.com
email3@demoA.com
TestB
testUser@demo.com
email4@test.com
ProjectC
email1@demo.com
我正在使用 sed 格式,但我知道有一种更简单的方法可以解决这个问题,而不是运行几个 sed 命令。
我希望格式在工作表中看起来像这样:
ProjectID1 | Email1 | Email2 | ...
ProjectID2 | Email1 | Email2 | Email3 | ...
ProjectID3 | Email1 | ...
我会使用 GNUAWK
来完成这个任务,让file.txt
内容
projectA
email1@demo.com
Email2@test.com
email3@demoA.com
TestB
testUser@demo.com
email4@test.com
ProjectC
email1@demo.com
然后
awk 'NR>1{printf /@/?" | ":"n"}{printf $0}' file.txt
输出
projectA | email1@demo.com | Email2@test.com | email3@demoA.com
TestB | testUser@demo.com | email4@test.com
ProjectC | email1@demo.com
假设:任何地方@
的每一行都是电子邮件,每隔一行都是项目 ID。
说明:我使用printf
,因为它不会在末尾添加换行符。在除第一行之外的所有行之前,我printf
|
或换行符(n
),具体取决于它是邮件行还是其他行,我使用三元运算符(条件?
值如果真:
值iffalse)根据行是否包含@
进行选择。对于我printf
的每一行。注意:我的代码生成没有尾随换行符的输出,如果您确实需要,请在{printf $0}
后面添加END{print ""}
。
(在Gawk 4.2.1中测试)
这可能对你有用(GNU sed):
sed -E ':a;N;s/n(.*@)/ | 1/;ta;P;D' file
收集行,按|
替换不是电子邮件地址的行和作为电子邮件地址的行之间的换行符。