3

我在 BSD 平台 (OSX) 上开发的应用程序中使用了出色的 UNIX 'comm' 命令行实用程序。当我部署到我的 Linux 生产服务器时,我很遗憾地发现,Ubuntu Linux 的“comm”实用程序没有使用 -i 标志来指示应该不区分大小写地比较行。显然 POSIX 标准不需要 -i 选项。

所以...我陷入困境。我真的需要在 BSD 上运行良好的 -i 选项。到目前为止,我已经尝试在 Linux 机器上编译 BSD comm.c 源代码,但我得到了:

http://svn.freebsd.org/viewvc/base/user/luigi/ipfw3-head/usr.bin/comm/comm.c?view=markup&pathrev=200559

me@host:~$ gcc comm.c 
comm.c: In function ‘getline’:
comm.c:195: warning: assignment makes pointer from integer without a cast
comm.c: In function ‘wcsicoll’:
comm.c:264: warning: assignment makes pointer from integer without a cast
comm.c:270: warning: assignment makes pointer from integer without a cast
/tmp/ccrvPbfz.o: In function `getline':
comm.c:(.text+0x421): undefined reference to `reallocf'
/tmp/ccrvPbfz.o: In function `wcsicoll':
comm.c:(.text+0x691): undefined reference to `reallocf'
comm.c:(.text+0x6ef): undefined reference to `reallocf'
collect2: ld returned 1 exit status

有人对如何在 Linux 上获得支持“comm -i”的 comm 版本有任何建议吗?

谢谢!

4

4 回答 4

1

您可以在中添加以下内容comm.c

void *reallocf(void *ptr, size_t size)
{
    void *ret = realloc(ptr, size);
    if (ret == NULL) {
        free(ptr);
    }
    return ret;
}

然后你应该能够编译它。确保里面comm.c#include <stdlib.h>(它可能已经这样做了)。

您的编译失败的原因是因为 BSDcomm.c使用reallocf()的不是标准的 C 函数。但是很容易写。

于 2010-01-28T09:19:49.920 回答
1

@OP,没有必要花这么多时间来做你自己的 src 代码编译。这是一个替代建议。由于您希望不区分大小写,因此您可以使用其他工具将两个文件中的大小写转换为小写(或大写),例如tr在将文件传递给 comm 之前。

tr '[A-Z]' '[a-z]' <file1 > temp1
tr '[A-Z]' '[a-z]' <file2 > temp2
comm temp1 temp2
于 2010-01-28T09:31:32.797 回答
0

有人对如何在 Linux 上获得支持“comm -i”的 comm 版本有任何建议吗?

不完全是;但是您是否检查过实用程序是否可以满足您的要求join?这个确实-iLinux上的选项......

于 2010-01-28T09:23:42.100 回答
0

您可以尝试对这两个文件进行分类并将它们通过管道传输到 uniq -c -i。它将显示两个文件中的所有行,并在第一列中显示出现次数。只要原始文件没有重复的行,第一列 >1 的所有行都是两个文件共有的行。

希望能帮助到你!

于 2010-02-26T13:31:13.677 回答