首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改awk脚本以在Solaris上工作

如何更改awk脚本以在Solaris上工作
EN

Stack Overflow用户
提问于 2019-05-10 22:37:40
回答 2查看 287关注 0票数 1

下面的脚本是bin-packing -fit算法,脚本在ubuntu上正常运行,我可以调用bin_packing.awk,但是当我尝试在unix solaris上运行它时,会出现错误。

bin_packing.awk

代码语言:javascript
复制
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"
}

并称之为:

代码语言:javascript
复制
$ find . -type f -iname '*pdf' -printf "%s %p\n" \
  | awk -v c=100000 -f bin_packing.awk

这将创建一个文件列表,文件大小以其前面的字节为单位,值c为目录可具有的最大字节大小。上面的值c=100000只是一个例子,这将创建如下所示的输出:

代码语言:javascript
复制
...
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中是不可用的。

查找:坏选项-printf查找:-H -L路径列表谓词列表awk:第1行附近的语法错误

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-11 00:42:08

在Solaris中使用nawk (新的awk)或/usr/xpg4/bin/awk (POSIX )。awk是最初的Perl遗留版本,用于收集与find的-printf相同的信息:

以下是解决办法:

代码语言:javascript
复制
$ find . -type f -name '*.pdf' -print | perl -lne '$,=" "; @s=stat $_; print $s[7],$_, $s[2]' | nawk -v c=5000000 -f bin_packing.awk
票数 3
EN

Stack Overflow用户

发布于 2019-05-11 01:14:09

要保存缺少的--printf查找功能的问题,可以尝试:

代码语言:javascript
复制
find . -type f -iname '*pdf' -exec stat --printf="%s %n\n" {} \; \
| awk -v c=100000 -f bin_packing.awk
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56085628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档