Якщо ваша мета - знайти загальні або нечасті лінії, то тут comm
би була моя команда go-to.
Він порівнює два файли та показує - у трьох стовпцях - рядки, унікальні для файлу 1, рядки, унікальні для файлу 2, та рядки, що відображаються в обох файлах відповідно. Ви можете передати його прапорами, щоб придушити будь-який з цих результатів. Наприклад comm -1 file1 file2
, придушить перший стовпець, унікальні для файлу речі1. comm -12 file1 file2
показав би лише речі в обох файлах.
Є одне велике застереження: вхід повинен бути відсортований. Ми можемо обійти це.
Це покаже вам все в abc, що не в mno:
comm -23 <(sort abc.txt) <(sort mno.txt)
І ви можете підключити це, wc -l
щоб отримати рахунок.
Причина, з якої я йду, comm
полягає в тому, що після сортування файлів порівняльне порівняння обчислювальних даних обчислювально дуже просто. Якщо ви маєте справу з мільйонами, це змінить значення.
Це можна продемонструвати за допомогою декількох файлів макетів. У мене досить швидкий комп'ютер, тому щоб показати різницю між підходами, мені потрібен набір зразків для мамонта. Я перейшов до 10 мільйонів 10-знакових рядків на файл.
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > abc.txt
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > mno.txt
$ time comm -23 <(sort abc.txt) <(sort mno.txt) | wc -l
... 0m10.653s
$ time grep -Fcxv -f abc.txt mno.txt
... 0m23.920s
$ time grep -Fcwv -f abc.txt mno.txt
... 0m40.313s
$ time awk 'NR==FNR{a[$0]++};NR!=FNR && a[$0]' abc.txt mno.txt | wc -l
... 0m12.161s
Сортування - це те, що займає більшу частину часу в моєму. Якщо ми зробимо вигляд, що abc.txt є статичним, ми можемо попередньо відсортувати його, і це робить майбутні порівняння набагато швидшими:
$ sort abc.txt abc-sorted.txt
$ time comm -23 abc-sorted.txt <(sort mno.txt) | wc -l
... 0m7.426s
Ви можете подивитися на це і вважати кілька секунд невідповідними, але я мушу підкреслити, що вони працюють на машині високого класу. Якщо ви хотіли це зробити на (наприклад) Raspberry Pi 3, ви будете дивитись на набагато повільніші повороти, і різниця збільшиться до точки, яка насправді має значення.
grep -cxvFf abc.txt mno.txt
?