読者です 読者をやめる 読者になる 読者になる

シス管系女子 Advent Calendar 2016 15日目

これはシス管系女子 Advent Calendar 2016(http://www.adventar.org/calendars/1692 )の15日目の記事です.

シス管系女子 Advent Calendar 2016 8日目(http://sakura818uuu.hatenadiary.com/entry/2016/12/08/082917)の記事の続きです.
複行レコードのテキストファイルを電話帳のように並びかえてみるという内容です.

8日目にSTEP:1 複数行をひとまとまりとしてみる.
15日目は STEP2アルファベット順かつ年代順に整列させる
STEP3重複を削除する
をやる予定だったのですが結論をいうと解くことが出来ませんでした.

元データはここ(https://gist.github.com/sakura818uuu/f8895404e4bebf3faeb7a4e68f505130)です. 私の環境はUbuntu15.10,x86_64,bash4.3.42です.

作成途中のawkファイル(これは上手くいきません)
このファイルだと明らかに複数回出力してしまう文があったり並び順がちぐはぐなことになってしまいます. sort $1をする前にフィールド番号で配列?等の処理をしてuniqにしたほうがいいのか、もしくは各レコードの内容を比較してsort | uniqのような動作を施したほうがいいのか、考えれば考えるほどよくわからなくなりました.

#edit_recon_list.awk

#! /bin/awk -f

BEGIN { 
    FS="\n"
    RS="" 
    ORS="\n\n"
}

{    printf("%s\n", $1) 
     for (i=1; i<= NF; i++)
         printf("%s\n",$i)
}
sort $1 
    {for (i=2;i<=NF;i++) 
       printf("%s\n",$i)
}
uniq $1 

複行レコードを1行レコードに変換してからsort | uniqするのも手だと思ったのですが、今回は複行レコードで試してみたくその方法をとりませんでした.
参考文献で一番関連があり興味深い情報がのっていたのは
A.V.エイホ/B.W.カーニハン/P.J.ワインバーガー 足立高徳=訳 (1997).プログラミング言語AWK 株式会社トッパン
です.特にawkでの複行レコードでのデータ処理がのっておりとても参考になりました.
Google検索で"awk multiline record sort"や"awk 複行レコード (電話帳)"などの検索結果も(結果的には解けませんでしたが)すごくためになるものが多かったです.
sortのタイミングやフィールド番号を比較する方法はあっていたのか今はわかりません.
また今度挑戦してみます.