排序 - 在排序列表中以相同字母开头的每个组前面添加任意字符串

排序 - 在排序列表中以相同字母开头的每个组前面添加任意字符串

给出以下列表(输入):

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将字符视为字段。这在 GNU awk( )中肯定有效gawk。其他实现可能支持也可能不支持。 POSIX 规定“如果FS是空字符串,则行为未指定”。
  • if (NF != 0)负责忽略空行。您没有指定具体的行为,但我认为这是正确的。
  • c存储前一个第一个字符的大写版本。
  • if (toupper($1) != c)检查当前记录(即输入行)中第一个字段(即第一个字符)的大写版本是否与存储的值不同。当遇到第一个非空行时,此代码将首次运行。这种情况发生在c分配任何东西并且条件基本成立之前。对于后面的几行来说,这可能是真的,也可能不是。
  • if (c != "") print ""打印一个空行来分隔组,除非不c存储任何内容,这意味着尚未打印任何组。这样我们就可以避免输出中第一组之前出现空行。
  • c = toupper($1)更新c
  • print "== "c" =="打印您请求的组标题。
  • print打印当前记录(输入行)。

相关内容