条件に応じて awk に空行を追加する

条件に応じて awk に空行を追加する

みんなこんにちは、

ファイルの一致する行グループを分割するために空行を使用したいと思います。 awkに初めて触れたので、いくつかの修正を経て、次のように思い出しました。

awk '!($0 in a) {print "\n"; a[$0]}; {print}'

私の心の中で次のように読む

現在行が配列「a」にない場合は、改行文字を印刷し、その行を「a」に追加します。現在の行を印刷します。

テストファイルに対して実行すると、出力は次のようになります。



abc
abc


def
def
def


ghi

つまり、1つではなく2つの空白行が印刷されます。追加のラインはどこから出ますか?

これは私が使用するテストファイルです。

abc
abc
def
def
def
ghi

ベストアンサー1

接続された配列は必要ありません。

awk 'prev!=""{ print prev!=$0? prev ORS : $0 } { prev=$0 }
END{ if(prev!="") print prev }' infile

出力:

abc
abc

def
def
def

ghi

awk改行文字を2回印刷する理由は、print基本的に印刷中の内容+ORS(酸素出力エココードSprintf "\n"デフォルトでは、改行文字である区切り文字を代わりに使用する必要があり、print ""独自のソリューションを使用して次のことができます(いくつかの修正を適用)。

awk '!($0 in a) { if(c++) print "" } { a[$0]; print}' infile

またはより簡潔に:

awk '!($0 in a) && c++{ print ""} ++a[$0]' infile

おすすめ記事