Сравнение двух списков с помощью сценария оболочки
-
05-07-2019 - |
Вопрос
Предположим, у меня есть два списка чисел в файлах f1, f2, каждый номер один на строку. Я хочу увидеть, сколько чисел в первом списке нет во втором, и наоборот. В настоящее время я использую grep -f f2 -v f1, а затем повторяю это с помощью сценария оболочки. Это довольно медленно (квадратичное время болит). Есть ли лучший способ сделать это?
Решение
Мне нравится «комм» для такого рода вещей. (файлы должны быть отсортированы.)
$ cat f1
1
2
3
$ cat f2
1
4
5
$ comm f1 f2
1
2
3
4
5
$ comm -12 f1 f2
1
$ comm -23 f1 f2
2
3
$ comm -13 f1 f2
4
5
$
Другие советы
Не могли бы вы просто поместить каждое число в одну строку, а затем diff
(1) их? Возможно, вам придется отсортировать списки заранее, хотя для того, чтобы это работало должным образом.
В особом случае, когда один файл является подмножеством другого , следующее:
cat f1 f2 | sort | uniq -u
перечислит строки только в большего файла. И, конечно, при переходе к wc -l
будет показано количество.
Однако это не совсем то, что вы описали.
Этот однострочник часто служит моим конкретным потребностям, но я бы хотел увидеть более общее решение.