• このエントリーをはてなブックマークに追加

【linux豆知識】連続する番号の中から欠番を見つける(awk)

  • このエントリーをはてなブックマークに追加

shell
zaco muraです。

またまたシェルスクリプトのネタです。

たまーにあることなんですが、ログなどで番号が連続するものの中からどこかが欠けている。けど、どこが欠けているのかわからない。ということがあります。
要するにこういうことですね。

1
2
4
5
6
9
10
11
12

↑この例で言うと、3と7,8が欠けています。

このくらいの数であればどこが欠けているかを見つけるのはそんなに難しくないんですが、これが数百万行とか数千万行になってしまうとちょっと目視では難しいですよね。

今回はこれを効率的に見つけるスクリプトをご紹介します。

$ echo -e "1\n2\n4\n5\n6\n9\n10\n11\n12" | awk -v sabun=0 '{if((NR+sabun)!=$0){for(i=0;NR+sabun+i!=$0;i++){print NR+sabun+i};sabun+=i}}'
3
7
8

このように、欠けている数値を見つけることができました。

このスクリプトでは行数(NR)数値を比較して、違った場合には一致するまで変数sabunを足していきます。

もう少しスクリプトっぽく改行を入れるとこんな感じです。

awk -v sabun=0 '{

    ### 行数+差分が数値と一致するかを確認
    if((NR+sabun)!=$0){

        ### 一致しない場合は、一致するまで1ずつ足していく
        for(i=0;NR+sabun+i!=$0;i++){

            ### 1ずつ足していく数値は欠けているということなので、表示
            print NR+sabun+i
        }

        ### 1ずつ足していって一致した場合は、その分を差分に反映
        sabun+=i
    }
}'

ということで、ちょっとしたログ解析のノウハウでした。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link