17

How to subtract a set from another in Bash?

This is similar to: Is there a "set" data structure in bash? but different as it asks how to perform the subtraction, with code

  • set1: N lines as output by a filter
  • set2: M lines as output by a filter

how to get:

  • set3: with all lines in N which don't appear in M
4

5 に答える 5

15
comm -23 <(command_which_generate_N|sort) <(command_which_generate_M|sort)

オプションなしの comm は、3 列の出力を表示します: 1: 最初のファイルのみ、2: 2 番目のファイルのみ、3: 両方のファイル。-23 は、2 番目と 3 番目の列を削除します。

$ cat > file1.list
A
B
C
$ cat > file2.list
A
C
D
$ comm file1.list file2.list 
        A
B
        C
    D
$ comm -12 file1.list file2.list # In both
A
C
$ comm -23 file1.list file2.list # Only in set 1
B
$ comm -13 file1.list file2.list # Only in set 2
D

入力ファイルはソートする必要があります。

GNU sort と comm はロケールに依存します。たとえば、出力順序が異なる場合があります (ただし、内容は同じである必要があります)。

(export LC_ALL=C; comm -23 <(command_which_generate_N|sort) <(command_which_generate_M|sort))
于 2012-08-15T05:21:28.677 に答える
4

uniq -u(マンページ)は、多くの場合、リスト減算の最も単純なツールです。

使用法

uniq [OPTION]... [INPUT [OUTPUT]] 
[...]
-u, --unique
    only print unique lines

例: ディレクトリ a にあるが b にはないファイルを一覧表示する

$ ls a
file1  file2  file3
$ ls b
file1  file3

$ echo "$(ls a ; ls b)" | sort | uniq -u
file2
于 2017-05-18T09:16:11.520 に答える