次のリスト(入力)が与えられた場合:
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
現在のレコード(入力行)を印刷します。