2012-02-08 7 views
1

私は2つのファイルを比較するCOMMコマンドを使用しましたが、私は3番目のファイルにそれがパイプにできないよ:comm出力をファイルにパイプするにはどうすればよいですか?

comm file1 file2 > file3 

comm: file 1 is not in sorted order 
comm: file 2 is not in sorted order 

私はこれをどのように行うのですか? ファイルは既にソートされています。

(COMM FILE1 FILE2作品、それをプリントアウト)

サンプル入力:
FILE1:

21 
24 
31 
36 
40 
87 
105 
134 
... 

FILE2:

10 
21 
31 
36 
40 
40 
87 
103 
... 

COMM FILE1 FILE2:

作品
comm file1 file2 > file3 

comm: file 1 is not in sorted order 
comm: file 2 is not in sorted order 
+0

これらのメッセージを生成するサンプル入力をいくつか提供できますか? – Johnsyweb

+0

'comm -3 file1 file2'はstdoutに何を表示しますか? – anubhava

答えて

4

数字でソートしました。 commは、レキシカルソートされたファイルで動作します。

たとえば、file2では、行103は、行21 ... 87で劇的に順不同です。あなたのファイルは '平文sortソート'である必要があります。

bash(4。x)は、あなたがプロセスの代替使用することができます。

comm <(sort file1) <(sort file2) 

をこれには2つのコマンドを実行し、commプロセスは、彼らがファイルであるかのように彼らの標準出力を読み取るためになることを保証します。

それに失敗:

(
sort -o file1 file1 & 
sort -o file2 file2 & 
wait 
comm file1 file2 
) 

これは同時にソートファイルを取得するために並列処理を使用しています。サブシェル((...))は、他のバックグラウンドプロセスが終了するのを待つことがないようにします。

1

まず、ファイルをsortプログラムでソートする必要があります。

+0

申し訳ありませんが、彼らはすでにソートされていることを忘れていました – user794479

+2

commの '--nocheck-order'スイッチを使用しますが、私は' comm'がそうではないと思う理由を調べようとします。 – Joni

+0

はうまくいっていますが、私はまだそれほど確かではありません! – user794479

1

試してみてください。

sort -o file1 file1 
sort -o file2 file2 
comm file1 file2 > file3 
+0

申し訳ありませんが、彼らはすでにソートされていることを忘れていた – user794479

+1

@ user794479:なぜあなたの質問は明示的に言及しています:通信:ファイル1はソートされた順序ではありません通信:ファイル2はソートされた順序ではありません – Mithrandir

+0

私は> – user794479

2

あなたのサンプルデータは、(-nオプションなし)commsortなどのコマンド何である、辞書順(辞書のように)ソートませで期待して、例えば100すべきですあなたが出力をリダイレクトしないときに、エラーがターミナルの出力行と混在するので、単にエラーメッセージに気付いていないことを確かめていますか?

+0

+1:これは正解と思われます(私が入力している間に投稿しました)。 – Johnsyweb

1

私はあなたと同じ結果を得ていませんが、あなたのバージョンcommはファイルが語彙的にソートされていないと不平を言っています。

$ comm file[12] 
     10 
       21 
24 
       31 
       36 
       40 
     40 
       87 
     103 
     ... 
105 
134 
... 

は、私は...が3列目にはなかったことに驚きましたので、私が試した

あなたが提供された入力を使用した( ...はそれが面白く、私はそれはあなたの実際のファイルの一部ではありません知っている。):

$ comm <(sort file1) <(sort file2) 
       ... 
     10 
     103 
105 
134 
       21 
24 
       31 
       36 
       40 
     40 
       87 

それは良いですが、105> 24、そうですか?

$ comm <(sort -n file1) <(sort -n file2) 
       ... 
     10 
       21 
24 
       31 
       36 
       40 
     40 
       87 
     103 
105 
134 

私はそれらは、あなたが探している結果だったと思います。 2つの40も面白いです。これらを排除したい場合:

$ comm <(sort -nu file1) <(sort -nu file2) 
       ... 
     10 
       21 
24 
       31 
       36 
       40 
       87 
     103 
105 
134 
0

私がsortを実行したにもかかわらずcommが不平を言っていたのと同様の問題が発生しました。問題は私がCygwinを実行していて、sortがいくつかのMSDOSバージョンを指していたことです(私は推測します)。特定のパス(私のケースではC:\ Cygwin \ bin \ sort)を使用することによって、それが機能しました。

関連する問題