给出以下列表(输入):
apple
banana
blueberry
mango
melon
我想要以下输出:
== A ==
apple
== B ==
banana
blueberry
== M ==
mango
melon
这是否可以在 shell 脚本中完成,也许可以使用awk
其他文本处理实用程序?
答案1
awk -F '' '
{ if (NF != 0)
{ if (toupper($1) != c)
{ if (c != "") print ""
c = toupper($1)
print "== "c" =="
}
print
}
}'
解释:
-F ''
使awk
将字符视为字段。这在 GNUawk
( )中肯定有效gawk
。其他实现可能支持也可能不支持。 POSIX 规定“如果FS
是空字符串,则行为未指定”。if (NF != 0)
负责忽略空行。您没有指定具体的行为,但我认为这是正确的。c
存储前一个第一个字符的大写版本。if (toupper($1) != c)
检查当前记录(即输入行)中第一个字段(即第一个字符)的大写版本是否与存储的值不同。当遇到第一个非空行时,此代码将首次运行。这种情况发生在c
分配任何东西并且条件基本成立之前。对于后面的几行来说,这可能是真的,也可能不是。if (c != "") print ""
打印一个空行来分隔组,除非不c
存储任何内容,这意味着尚未打印任何组。这样我们就可以避免输出中第一组之前出现空行。c = toupper($1)
更新c
。print "== "c" =="
打印您请求的组标题。print
打印当前记录(输入行)。