一番長いファイル名を探す
一番長いファイル名を探すプログラム - みずぴー日記 にインスパイヤされて同じようなプログラムを作ってみます。
ソートは自前の 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




