同じ名前をグループ化する正規表現

同じ名前をグループ化する正規表現

foo.txtに次の行があります

aaa:6600 location: US

aaa:6622 location: US

xxx:6601 location: EU

xxx:6602 location: EU

xxx:6603 location: EU

ggg:7701 location: KR

ggg:8808 location: KR

同じギャザーで始まるすべてのものをグループ化し、それらの間に1つの新しい行を挿入したいので、最終出力は次のようになります。

    aaa:6600 location: US
    aaa:6622 location: US

    xxx:6601 location: EU
    xxx:6602 location: EU
    xxx:6603 location: EU

    ggg:7701 location: KR
    ggg:8808 location: KR

答え1

awk -F: '/^$/{next}$1!=f&&NR>1{print ""}{f=$1;print;}' foo.txt

与える

aaa:6600 location: US
aaa:6622 location: US

xxx:6601 location: EU
xxx:6602 location: EU
xxx:6603 location: EU

ggg:7701 location: KR
ggg:8808 location: KR

サンプルデータについて。

説明。

-F:、フィールドがコロンで区切られることを指定/^$/{next}します。 は、入力内のすべての空白行をスキップすることを指定します。$1!=f&&NR>1{print ""}現在の名前が に保存されたものと同じでなくf、ファイル内の行番号が 1 より大きい場合は、空白行を出力して新しいグループを開始します。{f=$1;print}すべての行に対して、 に名前を保存しf、その行を出力します。 これを短くする方法はいくつかありますが、私にとっては、基本的な 以上のものは必要ありませんawk

答え2

$ awk -F':' '!NF{next} $1 != prev{if (NR>1) print ""; prev=$1} 1' file
aaa:6600 location: US
aaa:6622 location: US

xxx:6601 location: EU
xxx:6602 location: EU
xxx:6603 location: EU

ggg:7701 location: KR
ggg:8808 location: KR

関連情報