Сравните аналогичный файл и не похожие файлы, отображаемые ниже вывода в awk?

Я хотел бы сравнить следующие 2 файла и отобразить сравнение двух файлов друг с другом.

Файл №1:

DATE DS 2012-08-02 1 2013-06-23 1 2013-06-27 2 2013-06-28 2 2013-06-29 779 

Файл №2:

 DATE DE 2013-06-16 5 2013-06-17 1 2013-06-18 3 2013-06-19 1 2013-06-20 5 2013-06-21 6 2013-06-22 6 2013-06-23 6 2013-06-24 5 2013-06-25 9 2013-06-26 7 2013-06-27 22 2013-06-28 59 2013-06-29 334 2013-06-30 11 

Сравнение файла # 1 & # 2:

 DATE DS DE 2012-08-02 - 1 2012-08-05 - 2 2013-06-16 5 - 2013-06-17 1 - 2013-06-18 3 - 2013-06-19 1 - 2013-06-20 5 - 2013-06-21 6 - 2013-06-22 6 - 2013-06-23 6 - 2013-06-24 5 - 2013-06-25 9 - 2013-06-26 7 1 2013-06-27 22 2 2013-06-28 59 2 2013-06-29 334 779 2013-06-30 11 - 

Над файлом1, DATE и DS означает «данные выбраны» для определенной даты того, сколько выбранных. Он показывает из файлов file1 и file2 также одно и то же, но разные даты для количества дезактивированных (DE).

Теперь я хочу отображать из file1 & file2 с помощью AWK.

Дата для $ 1 из обоих файлов, $ 2 из файла1, $ 2 из файла2. Если какая-то конкретная дата сравнивается, она отображает DE, DA.

Например:

 DATE DE DS 2012-08-1 - 1 # Date is present in $1 from file1 but file2 is not there. # This is the date I want. Also I want to display a (-) for # DE which is not there. 

Может быть:

 join -a 1 -a 2 -o 0,1.2,2.2 -e - file1 file2 

Описание команды выше

Если в системе GNU (например, в большинстве дистрибутивов на базе Linux) вы можете узнать, какие опции для join с этой командой:

 $ info coreutils 'join invocation' 

или

 $ info join 

(при условии, что каталог info правильно поддерживается)

Или вы можете проверить спецификацию POSIX, чтобы увидеть, что гарантировано для работы с Unices.

Вышеуказанные варианты:

 `-a FILE-NUMBER' Print a line for each unpairable line in file FILE-NUMBER (either `1' or `2'), in addition to the normal output. 

Это покрывает ваше требование для строк, не спаренных (где дата (поле объединения) не отображается в обоих) для включения.

 `-o FIELD-LIST' Construct each output line according to the format in FIELD-LIST. Each element in FIELD-LIST is either the single character `0' or has the form MN where the file number, M, is `1' or `2' and N is a positive field number. 

Этот параметр создает формат, который будет отображаться для каждой строки вывода из join . A 0 испускает поле, которое сопоставляется между двумя файлами. Это дата. 1.2 – это второй столбец из первого файла (file1), а 2.2 – второй столбец из второго файла (файл2).

 `-e STRING' Replace those output fields that are missing in the input with STRING. 

Этот параметр указывает, какой символ использовать для полей, отсутствующих в файле file1 или file2. Это то, что генерирует - , в конечном результате.

Использование столбца

Используя предложение @ GlennJackman, вы можете очистить выход дальше, чтобы он был хорошо отформатирован в столбцах равного размера:

 $ join -a 1 -a 2 -o 0,1.2,2.2 -e - file1 file2 | column -t DATE DS DE 2012-08-02 1 - 2013-06-16 - 5 2013-06-17 - 1 2013-06-18 - 3 2013-06-19 - 1 2013-06-20 - 5 2013-06-21 - 6 2013-06-22 - 6 2013-06-23 1 6 2013-06-24 - 5 2013-06-25 - 9 2013-06-26 - 7 2013-06-27 2 22 2013-06-28 2 59 2013-06-29 779 334 2013-06-30 - 11 

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

Вы можете пропустить первую строку с помощью ( ksh93 / zsh / bash ):

 join -a 1 -a 2 -o 0,1.2,2.2 -e - <(tail -n +2 file1) <(tail -n +2 file2)