Bash

排序 - 在排序列表中以相同字母開頭的每個組前面加上任意字元串

  • September 11, 2020

給定以下列表(輸入):

apple
banana
blueberry
mango
melon

我想要以下輸出:

== A ==
apple

== B ==
banana
blueberry

== M ==
mango
melon

這是否可以在 shell 腳本中完成,也許可以使用awk或其他一些文本處理實用程序?

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列印目前記錄(輸入行)。

引用自:https://unix.stackexchange.com/questions/609011