Как изменить скрипт awk для работы на Solaris - PullRequest
1 голос
/ 11 мая 2019

нижеприведенный скрипт является бин-пакетом Алгоритм первой подгонки, скрипт работает нормально на Ubuntu Linux, и я могу вызвать bin_packing.awk, но когда я пытаюсь запустить его на Unix Solaris, я получаю ошибки

bin_packing.awk * * 1004

function first_fit(v, file) {
    # find first bin that can accomodate the volume
    for (i=1; i<=n; ++i) {
        if (b[i] > v) {
            b[i] -= v
            bc[i]++
            cmd="mv "file" subdir_" i
            print cmd
            # system(cmd)
            return
        }
    }
    # no bin found, create new bin
    if (i > n) {
        b[++n] = c - v
        bc[n]++
        cmd="mkdir subdir_"n
        print cmd
        # system(cmd)
        cmd="mv "file" subdir_"n
        print cmd
        # system(cmd)
    }
    return
}
BEGIN{ if( (c+0) == 0) exit }
{ first_fit($1,$2) }
END { print "REPORT:"
    print "Created",n,"directories"
    for(i=1;i<=n;++i) print "- subdir_"i,":", c-b[i],"bytes",bc[i],"files"
}

и назвать его:

$ find . -type f -iname '*pdf' -printf "%s %p\n" \
  | awk -v c=100000 -f bin_packing.awk

Это создаст список файлов с размером файла в байтах перед ним. Значение c будет максимальным размером каталога в байтах. Приведенное выше значение c = 100000 является только примером. Это создаст вывод, например:

...
mv file_47 subdir_6
mv file_48 subdir_6
mv file_49 subdir_5
mv file_50 subdir_6
REPORT:
Created 6 directories
- subdir_1 : 49 bytes 12 files
- subdir_2 : 49 bytes 9 files
- subdir_3 : 49 bytes 8 files
- subdir_4 : 49 bytes 8 files
- subdir_5 : 48 bytes 8 files
- subdir_6 : 37 bytes 5 files

он показывает приведенные ниже ошибки, если я пытаюсь запустить его на Solaris, и на основе обратной связи -printf является функцией GNU, поэтому он не доступен в не-GNU версиях find

find: bad option -printf
find: [-H | -L] path-list predicate-list
awk: syntax error near line 1
awk: bailing out near line 1

Ответы [ 2 ]

3 голосов
/ 11 мая 2019

с использованием nawk (новый awk) или /usr/xpg4/bin/awk (POSIX awk) с Solaris.awk - это оригинальная унаследованная версия с Perl для получения той же информации, что и find -printf:

Вот решение:

$ find . -type f -name '*.pdf' -print | perl -lne '$,=" "; @s=stat $_; print $s[7],$_, $s[2]' | nawk -v c=5000000 -f bin_packing.awk
0 голосов
/ 11 мая 2019

, чтобы сохранить проблему с отсутствующей функцией --printf find, вы можете попробовать:

find . -type f -iname '*pdf' -exec stat --printf="%s %n\n" {} \; \
| awk -v c=100000 -f bin_packing.awk
...