並べ替え - 並べ替えられたリスト内の同じ文字で始まる各グループの前にランダムな文字列を追加します。

並べ替え - 並べ替えられたリスト内の同じ文字で始まる各グループの前にランダムな文字列を追加します。

次のリスト(入力)が与えられた場合:

apple
banana
blueberry
mango
melon

私は次のような出力が欲しい。

== A ==
apple

== B ==
banana
blueberry

== M ==
mango
melon

awk他のテキスト処理ユーティリティを使用してシェルスクリプトでこれを実行できますか?

答え1

awk -F '' '
   { if (NF != 0)
      { if (toupper($1) != c)
         { if (c != "") print ""
            c = toupper($1)
            print "== "c" =="
         }
         print
      }
   }'

説明する:

  • -F ''awk文字がフィールドとして扱われるようにします。これはawk確かにGNU()で動作しますgawk。他の実装ではこれをサポートすることもサポートしない場合もあります。 POSIXでは、「FS空の文字列の場合は動作は指定されません」と言います。
  • if (NF != 0)空行を無視する役割を担います。具体的な行動を指定していませんが、それが正しいと思います。
  • c前の最初の文字の大文字のバージョンを保存します。
  • if (toupper($1) != c)現在のレコード(つまり、入力行)の最初のフィールド(つまり、最初の文字)の大文字のバージョンが保存された値と異なることを確認します。このコードは、空でない最初の行が表示されたときに初めて実行されます。これはc割り当て前に発生し、条件はデフォルトでtrueです。これは次の行に該当する場合もありません。
  • if (c != "") print ""c何も保存されていない場合(まだグループが印刷されていないことを意味する場合)、空白行を別のグループとして印刷します。これにより、出力の最初のグループの前に空白行が発生するのを防ぎます。
  • c = toupper($1)更新するc
  • print "== "c" =="要求されたグループのタイトルを印刷します。
  • print現在のレコード(入力行)を印刷します。

関連情報