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

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

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

私はOSC HOKKAIDO 2016に参加した時に『まんがでわかるLinux シス管系女子』を知りました。公立はこだて未来大学のライブラリーにも全2巻が所蔵されています。まんが形式で読みやすく、とても覚えやすかったです。

ここでは本編に触発されて書いたシェルスクリプト、"問題名が列挙されているのリストのtxtファイル(ファイル名:recon_list.txt)について説明します。

ファイルの中身は以下の画像のようになっており、

  • 1-2行目 ファイルの中身に関する説明
  • 3行目 空行
  • 4行目-最終行
    大会名 + 問題名
    カテゴリ+ ポイント(この行はない場合もあります)
    URL
    空行
    の繰り返しという構成になっています。

f:id:sakura818uuu:20161204215228p:plain

しかし、このファイルは問題名が重複しており、順番もばらばらです。 そこで、このファイルの問題名の重複を解消し、正しい順番に整列させるシェルスクリプトを作成することを目標にしました。

理想は以下の画像のように形式を崩さないまま複数行をひとつのまとまりとみて、大会名のアルファベット順かつ年代順に整列させることです。 f:id:sakura818uuu:20161205063515p:plain

本編p133を参考にまず全体の手順を考えます。
●複数行をひとまとまりとしてみる
●アルファベット順かつ年代順に整列させる
●重複を削除する
(※このファイルでソートせず重複行を削除(http://qiita.com/arcizan/items/9cf19cd982fa65f87546)する$awk '!a[$0]++' recon_list.txtを実行した場合、複数行をひとまりとしてみないためカテゴリ+ポイントの行の重複削除も実行されてしまい、理想の形になりません。)

STEP:1 複数行をひとまとまりとしてみる
ファイルの中身は複数行と空行の繰り返しになっています。そこでawkファイルを作成し、FS(フィールド区切り文字)を"\n"(改行)、RS(レコード区切り文字)を""(空行)と設定します。

#edit_recon_list.awk
BEGIN {
FS="\n"
RS=""
}

本当に複数行をひとまとまりにしてみれているのか確認するために先ほどのawkファイルに追記をします。NRは現在までに読み込んだレコード総数、NFは現在の入力レコードのフィールド数、print $0は現在のレコード全体を出力します。

#edit_recon_list.awk
BEGIN {
FS="\n"
RS="\n\n"
}
{
printf("*NR=%d NF=%d\n",NR,NF)
print $0
}

$ awk -f edit_recon_list.awk recon_list.txt と入力します。 これで複数行をひとまとまりとしてみれていること(複行レコード)が確認できました。

f:id:sakura818uuu:20161205095144p:plain

STEP2アルファベット順かつ年代順に整列させる
STEP3重複を削除する
は来週書きます