awkを使用して最初のアルファベットを変更した後に空白行を挿入する

awkを使用して最初のアルファベットを変更した後に空白行を挿入する

bash連絡先のスクリプトを作成しています。アルファベットを変更すると、アルファベットレコードを空白行に区切ることができないことを除いて、すべてがうまく機能します。 awkを使用してソートされ提供されるファイルがあります。出力は次のとおりです。

Anand Anju
Anand Sanjay
Das Ajay
Deshpande Shweta
Kanetkar Ashok
Kanetkar Jyoti
Sabane Dhananjay
Sahani Surinder

以下のような出力を生成したいと思います。

Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder

私は効果的な解決策が欲しいですawk

答え1

awk現在の入力行の最初の文字を選択するために使用されます。最初の文字が前の行と異なる場合は空行が出力されます。行の最初の文字を記憶し、現在の行を印刷します。これにより、最初の文字が前の行の最初の文字から変更された場合、各行の前に空白行が出力されます。

$ awk '{ cur = substr($0,1,1) } NR > 1 && cur != prev { print "" } { prev = cur; print }' file
Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder

答え2

その他アッ解決策:

awk 'NR>1 && a && substr($1,1,1)!=a{ print "" }{ a=substr($1,1,1) }1' file

  • substr($1,1,1)- 最初のフィールドから最初の文字を抽出します。

答え3

awk '{A[$1]++;if(A[$1]==1){printf("\n")}}1' FS= file

答え4

次の行をパターン空間に蓄積し、パターン空間の最初の文字をパターン空間の最後の行の最初の文字と比較します。

一致するものがあれば、パターン空間に別の行を追加します。 eofに遭遇するとすぐにコマンドを終了()して実行するので、この機能を利用するためにNプレフィックスを使用しません。$!

それ以外の場合は、ブロックの末尾に改行文字を配置します。

GNU sedが使用されているとします。

sed -e '
   :a;N
   /^\(.\).*\n\1[^\n]*$/ba
   h;s/\(.*\n\).*/\1/p
   g;s/.*\(\n\)/\1/;D
' file.txt

結果

Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder

関連情報