3

BSDプラットフォーム(OSX)で開発したアプリケーションで、優れたUNIXの「comm」コマンドラインユーティリティを使用しています。Linux実稼働サーバーにデプロイしたとき、悲しいことに、Ubuntu Linuxの「comm」ユーティリティは、行を大文字と小文字を区別せずに比較する必要があることを示すために-iフラグを取りません。どうやらPOSIX標準は-iオプションを必要としません。

だから...私は拘束されています。BSDで非常にうまく機能する-iオプションが本当に必要です。LinuxボックスでBSDcomm.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

'comm -i'をサポートするバージョンのcommをLinuxで取得する方法について誰か提案がありますか?

ありがとう!

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>(おそらく既に行われています)。

コンパイルが失敗する理由は、BSDが標準の C 関数ではないものをcomm.c使用しているためです。reallocf()でも書きやすいです。

于 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

'comm -i'をサポートするバージョンのcommをLinuxで取得する方法について誰か提案がありますか?

そうではありません。joinしかし、ユーティリティが要件を満たせるかどうかを確認しましたか?これLinuxの-iオプションがあります...

于 2010-01-28T09:23:42.100 に答える
0

両方のファイルを cat し、それらを uniq -c -i にパイプすることができます。両方のファイルのすべての行が表示され、最初の列に出現回数が表示されます。元のファイルに繰り返し行がない限り、最初の列が 1 より大きいすべての行は、両方のファイルに共通の行です。

それが役に立てば幸い!

于 2010-02-26T13:31:13.677 に答える