Bash
排序 - 在排序列表中以相同字母開頭的每個組前面加上任意字元串
給定以下列表(輸入):
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
字元視為欄位。這在 GNUawk
(gawk
) 中肯定有效。其他實現可能支持也可能不支持這一點。POSIX 聲明“如果FS
是空字元串,則行為未指定”。if (NF != 0)
負責忽略空行。您沒有具體說明這種確切的行為,但我認為這是正確的。c
儲存前一個字元的大寫版本。if (toupper($1) != c)
檢查目前記錄(即輸入行)中第一個欄位(即第一個字元)的大寫版本是否與儲存的值不同。當遇到第一個非空行時,此程式碼第一次執行。這發生在c
被分配任何東西之前,條件是微不足道的。對於後面的行,它可能是真的,也可能不是。if (c != "") print ""
列印將分隔組的空行,除非不c
儲存任何內容,這意味著尚未列印任何組。這樣我們就避免了輸出中第一組之前的空行。c = toupper($1)
更新c
。print "== "c" =="
列印您請求的組標題。