一番長いファイル名を探す

一番長いファイル名を探すプログラム - みずぴー日記 にインスパイヤされて同じようなプログラムを作ってみます。

ソートは自前の Quick Sort を用いることで nawk でも動作させています。

#! /usr/local/bin/nawk -f
# long_file.awk
# 一番長いファイル名を探す
# usage: nawk -f long_file.awk file[s]

BEGIN {
    for (i in ARGV) {
        base_file = basename(ARGV[i]);
        file[i] = sprintf("%03d %s", length(base_file), base_file);
    }

    quick_sort(file, 1, ARGC - 1);

    # 逆順で表示
    for (i = ARGC - 1; i >= 1; i--) {
        print substr(file[i], 5);
    }
}

# basename():   ディレクトリを削除しファイル名だけにする
#   in:     文字列 (str)
#   out:    最初の "/" 以前を削除した文字列 (str)
function basename(str) {
    gsub(/.*\//, "", str);
    return str;
}

# quick_sort():     再帰版 Quick Sort
#   in:     配列 arr
#           最初のインデックス left
#           最後のインデックス right
#   out:    ソートされた配列
function quick_sort(array, left, right,     i, j, tmp, pivot) {
    if (left < right) {
        i = left;
        j = right;
        pivot = array[int((left + right) / 2)];
        while (i <= j) {
            while (array[i] < pivot) {
                i++;
            }
            while (array[j] > pivot) {
                j--;
            }
            if (i <= j) {
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
                i++;
                j--;
            }
        }
        quick_sort(array, left, j);
        quick_sort(array, i, right);
    }
}

ここでは /usr/lib の中のファイルに対して実行してみます。

$ nawk -f long_file.awk /usr/lib/* | head -n 10
libmathview_frontend_libxml2_reader.so.0.8.0
libmathview_frontend_custom_reader.so.0.8.0
libglibmm_generate_extra_defs-2.4.so.1.2.0
libboost_unit_test_framework-mt.so.1.37.0
libmathview_frontend_libxml2_reader.so.0
libmathview_frontend_custom_reader.so.0
libgtkmathview_libxml2_reader.so.0.8.0
libglibmm_generate_extra_defs-2.4.so.1
libboost_unit_test_framework.so.1.37.0
libboost_prg_exec_monitor-mt.so.1.37.0

『一行野郎』で書けば以下のようなものになると思います。

$ ls -1 /usr/lib | awk '$0=length($0)" "$0' | sort -nr | \
awk 'NR<=10 && $0=$2'
libmathview_frontend_libxml2_reader.so.0.8.0
libmathview_frontend_custom_reader.so.0.8.0
libglibmm_generate_extra_defs-2.4.so.1.2.0
libboost_unit_test_framework-mt.so.1.37.0
libmathview_frontend_libxml2_reader.so.0
libmathview_frontend_custom_reader.so.0
libgtkmathview_libxml2_reader.so.0.8.0
libglibmm_generate_extra_defs-2.4.so.1
libboost_unit_test_framework.so.1.37.0
libboost_prg_exec_monitor-mt.so.1.37.0

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png