2010-08-23 2 views
1

У меня есть 2 текстовых файла для сравнения в их первом столбце. Следующая команда comm показывает общие строки из 2 файлов правильно.Сравните два файла

comm develop1.txt qa1.txt -12 

Но следующая команда diff не показывает разницу, как ожидалось.

diff develop1.txt qa1.txt --side-by-side 

Ожидаемый результат заключается в следующем:

mysql-data/webservice 280292 | mysql-data/webservice 28684 

Но эти два значения не на одной линии, так как число в последней колонке различны. Мне действительно нужно сравнивать числа в бок о бок. Как это можно достичь?

+0

# присоединиться develop1.txt QA1. txt # делает именно то, что я ищу. # может кто-нибудь теперь дать мне знать, как найти записи, которые есть в одном файле, но не во втором файле? – shantanuo

+0

Мое решение должно дать вам их в одном файле, но не в другом. Это не так элегантно, как решение для соединения, поэтому, если кто-то получает это (элегантно), игнорируйте мой ответ. Если нет, вы можете использовать его. Я обновлю его, чтобы лучше объяснить. – paxdiablo

ответ

3

Если вы готовы что-то быстро и грязно (не то, что я бы выпустить в серийное производство, но, конечно, хорошо для моих целей):

for key in $(cat develop1.txt qa1.txt | awk '{print $1}' | sort -u) ; do 
    devval=$(grep "^${key} " develop1.txt | awk '{print $2}') 
    qa1val=$(grep "^${key} " qa1.txt | awk '{print $2}') 
    if [[ "${devval}" != "${qa1val}" ]] ; then 
     echo "$key: dev=[${devval}], qa=[${qa1val}]" 
    fi 
done 

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

Вторая и третья строки просто получают значения для каждой клавиши из двух файлов.

Оператор if затем распечатывает ключ и два значения, но только там, где значения различны.

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

+0

##/mysql-data/support16:/mysql-data/support16 5880:/mysql-data/support16 438748 ## можно ли подавить такие строки? # Мне бы хотелось увидеть только базы данных из одного файла, отсутствующие в другом. – shantanuo

+0

@shantanuo, я исправил его так, что вы не получите ключ три раза (это был контроль с моей стороны, извините). Теперь те, у которых есть только один ключ, должны содержать текст '[]' (например, '/ mysql-data/support16: dev = [5880], qa = []'), чтобы вы могли запускать скрипт через '| grep '\\ [\\]' ', чтобы показать вам только те. – paxdiablo

1

Я не уверен, что я точно понимаю, что вы хотите сделать. Вы пытались использовать команду join? Учитывая два файла, которые содержат только пример строки вы показали, результат будет таким:

$ join develop1.txt qa1.txt 
mysql-data/webservice 280292 28684 

Вы можете сказать join для вывода непарной строки с:

$ join -a1 -a2 develop1.txt qa1.txt 
+0

Спасибо.Другими словами, я пытаюсь сделать это ... # mylist = 'join develop1.txt qa1.txt | awk '{print $ 1}' ' ## join -a1 -a2 develop1.txt qa1.txt | grep -v '$ mylist' ## не работает! – shantanuo

+0

@shantanuo - если каждая строка имеет только два столбца, попробуйте «join -a1 -a2 file1 file2 | awk 'NF == 2 {print; } '' – abyx

+0

Это не помогает мне понять, отображаются ли значения из первого или второго. – shantanuo

1

Я знаю, что то, что я скажу, не совсем то, что вы просите, но попробовали ли вы программу визуального разграничения? Такой WinMerge (для Windows) или Meld (для Linux)? Предварительный просмотр их интерфейсов ниже (взяты из Google Image):

WinMerge:

alt text

MELD:

alt text

Смежные вопросы