6

У меня есть два текстовых файла в Linux. Один содержит список действительных идентификаторов. Например:

abcd
efgh
ijkl
etc.

Другой содержит список недействительных идентификаторов. Но некоторые из них также появляются в списке допустимых идентификаторов, в этом примере "efgh":

mnop
qrst
efgh
etc.

Как я могу легко создать текстовый файл, который содержит все строки из недопустимого списка, которые не отображаются в допустимом списке? То есть я хочу получить текстовый файл, который имеет:

mnop
qrst
etc.

Я бы хотел использовать магию командной строки Linux или хитрый трюк с Vim. Заранее спасибо!

3 ответа3

9

Я думаю, что comm может помочь вам сделать то, что вы хотите.

Это менее известный инструмент командной строки, который должен присутствовать в большинстве систем Linux.

0

Предполагая, что у вас есть файлы с именами valid и invalid , вы можете отсортировать их:

сортировать действительный> действительный-отсортированный; сортировать неверно> неверно отсортировано

затем сравните:

diff действительный-отсортированный неверный-отсортированный

Вывод будет (при условии данных вашего примера):

1d0
< abcd
3c2,3
< ijkl
---
> mnop
> qrst

Материал с '<' находится только в первом файле, материал с '>' только во втором (недопустимый).

Таким образом, diff valid-sorted invalid-sorted |grep '^>' должен дать вам строки, которые отображаются как недействительные, но не действительные.

Избавление от «>» оставлено читателю как упражнение ;-).

Предостережение: это не будет работать, если ваши входные файлы на самом деле содержат '>' в начале строки. Тебе придётся сделать немного хитрости тогда ...

0

У меня есть своя утилита для этого, которая опирается на другую ; они также работают на несортированном вводе. Основное использование

except file1 file2 > file2-except-any-lines-in-file1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .