сравнение файлов linux - PullRequest
       1

сравнение файлов linux

1 голос
/ 29 ноября 2011

Я хочу сравнить два файла в Linux, но сравнение не должно основываться на построчном сравнении, и я хочу вывести результат в другой файл. Например:

file1:

ABC
B
KLM
JAH
MONU
PANDA

файл 2:

HELLO
PRETTI
ABC
B
LKMO

Теперь я хочу получить разницу между содержимым файла 1 и файла 2, а не построчно. Как (file1-file2), то есть содержимое файла 1, а не 2

файл различий:

KLM
JAH
MONU
PANDA

Я пытался использовать diff, comm в Linux, но он показывает результаты построчное сравнение

Ответы [ 4 ]

5 голосов
/ 29 ноября 2011
sort file1.txt file2.txt file2.txt | uniq -u

Сортирует файл1 и дважды файл2 на месте.При фильтрации уникальных значений будут сообщаться только те значения, которые присутствуют в файле file1 only

Если file1.txt разрешено повторять одно и то же значение, вам может потребоваться предварительная обработка, что приводит к небольшому уменьшениюболее сложный:

sort <(sort -u file1.txt) file2.txt file2.txt | uniq -u
1 голос
/ 14 февраля 2013

Я в замешательстве, почему comm не работает?

comm -23 <(sort file1) <(sort file2)

Используя ваши файлы примеров, вышеприведенное приводит к:

JAH
KLM
MONU
PANDA

Какой именно "файл" вы хотели, по модулю заказа. Теперь, если вы хотите, чтобы они сортировались так, как они отображаются в file1, это другое дело. Я предполагаю, что ваша проблема не подавила второй столбец, и именно так вы получили свое «построчное сравнение», а именно:

$ comm -3 <(sort file1) <(sort file2)
    HELLO
JAH
KLM
    LKMO
MONU
PANDA
    PRETTI

По вопросу создания «файла различий» с исходным порядком:

$ comm -23 <(sort file1) <(sort file2)|grep -f - file1
KLM
JAH
MONU
PANDA
0 голосов
/ 01 декабря 2011

Имеет ли значение порядок, в котором появляются строки? Если порядок не имеет значения, в awk есть действительно элегантное решение:

awk 'BEGIN { 
  while((getline<"file2.txt")>0) {
    eliminate[$0] = 1
  }
}
!($0 in eliminate) { print }' file1.txt
0 голосов
/ 29 ноября 2011

По выводам из примера я получаю вывод, что вы хотите вычислить Левенштейновское расстояние (также называемое расстояние редактирования ) между двумя файлами.

Цитирование Википедия :

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

Итак, насколько велики ваши файлы?А вы отслеживаете символы или слова?Для небольших файлов (небольшое количество символов или слов, в зависимости от ситуации) вы можете написать свой собственный инструмент расстояния Левенштейна для командной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...