Поиск дополнения к множеству в Unix - PullRequest
4 голосов
/ 29 января 2010

Учитывая это два файла:

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

Я хочу найти номер строки, который находится в «НО» в B. Что за Unix-команда для этого?

Я пробовал это, но, похоже, не удалось:

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

Ответы [ 4 ]

10 голосов
/ 29 января 2010
comm -2 -3 <(sort A.txt) <(sort B.txt)

должен делать то, что вы хотите, если я вас правильно понял.

Редактировать : На самом деле, comm требует, чтобы файлы были отсортированы в лексикографическом порядке, поэтому вам не нужно -n в вашей команде sort:

$ 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
3 голосов
/ 14 декабря 2011

обратите внимание, что решение 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
2 голосов
/ 29 января 2010

вы можете попробовать это

$ awk 'FNR==NR{a[$0];next} (!($0 in a))' B.txt A.txt
5
4
1 голос
/ 03 февраля 2015

Я недавно написал программу под названием Setdown , которая выполняет операции Set из клима.

Он может выполнять операции над множествами, записывая определение, похожее на то, что вы написали бы в Makefile:

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

Это довольно круто, и вы должны это проверить. Лично я не рекомендую использовать специальные команды, которые не были созданы для выполнения заданий. Он не будет работать хорошо, когда вам действительно нужно выполнить много операций над множествами или если у вас есть какие-либо операции над множествами, которые зависят друг от друга. Кроме того, setdown позволяет вам писать операции над множествами, которые зависят от других операций над множествами!

Во всяком случае, я думаю, что это довольно круто, и вы должны полностью это проверить.

Примечание : Я думаю, что Setdown намного лучше, чем comm просто потому, что Setdown не требует правильной сортировки ваших входных данных . Вместо этого Setdown отсортирует ваши входные данные и использует внешнюю сортировку. Так что он может обрабатывать большие файлы. Я считаю это большим преимуществом, потому что количество раз, которое я забыл сортировать файлы, которые я передал в comm, превышает количество.

...