3

次の 2 つのファイルを指定します。

 $ cat A.txt     $ cat B.txt
    3           11
    5           1
    1           12
    2           3
    4           2

Aにある「BUT NOT」の行番号をBに見つけたいのですが、そのためのUNIXコマンドは何ですか?

私はこれを試しましたが、失敗したようです:

comm -3 <(sort -n A.txt) <(sort -n B.txt) | sed 's/\t//g' 
4

5 に答える 5

10
comm -2 -3 <(sort A.txt) <(sort B.txt)

私があなたを正しく理解していれば、あなたが望むことをするべきです。

編集:実際には、ファイルを辞書順でソートする必要があるため、コマンドにcommは入れたくありません:-nsort

$ cat A.txt
1
4
112
$ cat B.txt
1
112
# Bad:
$ comm -2 -3 <(sort -n B.txt) <(sort -n B.txt)
4
comm: file 1 is not in sorted order
112
# OK:
$ comm -2 -3 <(sort A.txt) <(sort B.txt)
4
于 2010-01-29T05:10:19.990 に答える
3

あなたはこれを試すことができます

$ awk 'FNR==NR{a[$0];next} (!($0 in a))' B.txt A.txt
5
4
于 2010-01-29T05:29:57.603 に答える
2

awk ソリューションは機能しますが、A には重複が保持されます (B にはありません)。Python ソリューションは結果の重複を排除します

commは真の集合差を計算しないことにも注意してください。行がAで繰り返され、Bで繰り返される回数が少ない場合comm、結果に「余分な」行が残ります。

$ cat A.txt 
120
121
122
122
$ cat B.txt 
121
122
121
$ comm -23 <(sort A.txt) <(sort B.txt)
120
122

この動作が望ましくない場合は、sort -u重複を削除するために使用します (A 案件の重複のみ):

$ comm -23 <(sort -u A.txt) <(sort B.txt)
120
于 2011-12-13T23:25:14.007 に答える
1

最近、cli から Set 操作を行うSetdown というプログラムを作成しました。

Makefile に書き込むのと同様の定義を記述することで、集合演算を実行できます。

someUnion: "file-1.txt" \/ "file-2.txt"
someIntersection: "file-1.txt" /\ "file-2.txt"
someDifference: someUnion - someIntersection

それはかなりクールで、あなたはそれをチェックする必要があります. 個人的には、セット操作を実行するジョブ用に作成されていないアドホック コマンドを使用することはお勧めしません。本当に多くの集合操作を行う必要がある場合や、相互に依存する集合操作がある場合はうまく機能しません。それだけでなく、setdown を使用すると、他の集合操作に依存する集合操作を記述できます。

とにかくカッコイイと思いますので、ぜひチェックしてみてください。

注: Setdown は入力を正しくソートする必要がないという理由だけで、comm よりもはるかに優れていると思います。代わりに、Setdown が入力をソートし、外部ソートを使用します。そのため、大量のファイルを処理できます。comm に渡したファイルを並べ替えるのを忘れた回数は数え切れないほどあるので、これは大きなメリットだと思います。

于 2015-02-03T02:50:23.043 に答える