URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID15
Нить номер: 4385
[ Назад ]

Исходное сообщение
"Сравнить вывод двух команд, найти разницу"

Отправлено Seryoga2014 , 31-Окт-17 19:01 
Есть две некие команды, которые выдают довольно большой объём данных в виде таблиц. Таблицы разные, но в них есть схожая информация. В первой таблице среди прочего в двух столбцах есть комбинации неких чисел и во второй, в других столбцах и строчках есть такие же пары. Мне надо найти разницу - некоторых пар чисел не хватает, надо найти каких именно.

Как выделить из вывода каждой из команд нужные мне пары чисел и вывести их - я знаю (допустим, с помощью awk). Но как их потом сравнить между собой и, желательно, без промежуточных файлов? Как-то можно в grep прикрутить вывод другой команды, отфильтрованный с помощью awk? Или ещё какие-то методы есть?


Содержание

Сообщения в этом обсуждении
"Сравнить вывод двух команд, найти разницу"
Отправлено ACCA , 31-Окт-17 19:33 
Тебя понять невозможно. Покажи пример -
* кусок первой таблицы
* кусок второй
* результат

"Сравнить вывод двух команд, найти разницу"
Отправлено Seryoga2014 , 01-Ноя-17 17:39 
Таблица1
M  qra   -abc  201  -adc  72  -lll  8275   -wem  5      | true  mmm  9402
M  qra   -abc  201  -adc  72  -lll  8276   -wem  676    | true  mmm  9402
M  qra   -abc  201  -adc  72  -lll  8277   -wem  677    | true  mmm  9402

Таблица2
M  sb_rd   -zxt  shut-st   -abc  201  -adc  72  -lll  8276   -wem  676  
M  sb_rd   -xzt  shut-st   -abc  201  -adc  72  -lll  8275   -wem  5  
M  sb_rd   -zxt  shut-st   -abc  201  -adc  72  -lll  8277   -wem  677
M  sb_rd   -zxt  shut-st   -abc  201  -adc  72  -lll  8277   -wem  877

Каждая из этих таблиц очень длинные (результат вывода двух разных команд). Меня интересуют пары столбцов с числами после -lll и -wem. Значения в строках связаны между собой. Какой пары из первой таблицы не хватает во второй таблице? Т.е. нужно найти 8277 877. Надеюсь понятней объяснил на этот раз.


"Сравнить вывод двух команд, найти разницу"
Отправлено Seryoga2014 , 01-Ноя-17 18:51 

Таблица1
M  qra   -abc  201  -adc  72  -lll  8275   -wem  5      | true  mmm  9402
M  qra   -abc  201  -adc  72  -lll  8276   -wem  676    | true  mmm  9402
M  qra   -abc  201  -adc  72  -lll  8277   -wem  677    | true  mmm  9402
M  qra   -abc  201  -adc  72  -lll  8277   -wem  877    | true  mmm  9402

Таблица2
M  sb_rd   -zxt  shut-st   -abc  201  -adc  72  -lll  8276   -wem  676  
M  sb_rd   -xzt  shut-st   -abc  201  -adc  72  -lll  8275   -wem  5  
M  sb_rd   -zxt  shut-st   -abc  201  -adc  72  -lll  8277   -wem  677

Пардон, так правильней )


"Сравнить вывод двух команд, найти разницу"
Отправлено ACCA , 01-Ноя-17 22:45 
Ну, как-то так:

comm -3 <(sed 's/  */ /g' table1 | cut -d\  -f 8,10|sort -b) <(sed 's/  */ /g' table2 | cut -d\  -f 10,12|sort -b)

man comm - убедись, что ты понимаешь что он тебе ответил.


"Сравнить вывод двух команд, найти разницу"
Отправлено Seryoga2014 , 02-Ноя-17 16:20 
Спасибо. Я бы такую конструкцию вряд ли бы сочинил (про comm что-то даже и не слышал). Читать придётся не только про comm для полного понимания.

command1 | awk -F " " '{print $8" "$10}' - я так получал список чисел 8277 877 из вывода command1 (результат её работы - таблица1).

Правильно ли я понимаю, что тут не выводы двух команд (command1, command2) как-то сравниваются без создания промежуточных файлов (в первом сообщении писал об этом), а создаются два файла table1 и table2, которые затем обрабатываются?

В общем я получил такое:
comm -3 <(sed 's/  */ /g' table1.txt | cut -d\  -f 8,10|sort -b) <(sed 's/  */ /g' table2.txt | cut -d\  -f 10,12|sort -b)
Missing name for redirect.

Буду разбираться..


"Сравнить вывод двух команд, найти разницу"
Отправлено Andrey Mitrofanov , 02-Ноя-17 17:52 
> Спасибо. Я бы такую конструкцию вряд ли бы сочинил (про comm что-то
> даже и не слышал). Читать придётся не только про comm для
> полного понимания.
> command1 | awk -F " " '{print $8" "$10}' - я так
> получал список чисел 8277 877 из вывода command1 (результат её работы
> - таблица1).

Кстати, если сравнивать "прямо в awk-е, то [c bash-мизмами, может, и с gawk-измами] :

awk 'ARGIND==1{ >>>тут кладём $8 и $10 в один массив/хэш<<< }
ARGIND==2{ >>>тут кладём в другой массив данные из другой команды<<< }
END{ >>>а тут скрещиваем массивы и выводим результат<<<}
' <( commnad1)  <( commnad2)


Если данных для вывода достаточно уже на втором шаге ("кладём в другой массив"), то его можно "укоротить"-смержить с выводом-скрещиванием из END-а -- делать их прямо там.

> Missing name for redirect.
> Буду разбираться..


"Сравнить вывод двух команд, найти разницу"
Отправлено ACCA , 03-Ноя-17 22:27 
> этом), а создаются два файла table1 и table2, которые затем обрабатываются?

Не создаются, а я предположил, что твои команды уже создали table1.txt и table2.txt
Для команд просто:

comm -3 <(command1 | sed 's/  */ /g' | cut -d\  -f 8,10|sort -b) <(command2 | sed 's/  */ /g' | cut -d\  -f 10,12|sort -b)

> В общем я получил такое:
> comm -3 <(sed 's/  */ /g' table1.txt | cut -d\  
> -f 8,10|sort -b) <(sed 's/  */ /g' table2.txt | cut
> -d\  -f 10,12|sort -b)
> Missing name for redirect.

Есть мнение, что ты тут соврал - сюда скопировал команду из моего сообщения, а по факту запускал что-то другое, например с пробелами между `<' и `('. Ещё обрати внимание, что после -d\ - два пробела с разным смыслом. Первый - аргумент для -d, второй разделитель - перед -f.


"Сравнить вывод двух команд, найти разницу"
Отправлено DiJey , 10-Ноя-17 11:38 
если еще актуально, нужно у автора уточнить что за ОС и её версия, и в каком шеле запускает.
У мена на Rhel 7.4 данная команда так же верно отрабатывает.

"Сравнить вывод двух команд, найти разницу"
Отправлено Seryoga2014 , 14-Ноя-17 10:47 
> если еще актуально, нужно у автора уточнить что за ОС и её
> версия, и в каком шеле запускает.
> У мена на Rhel 7.4 данная команда так же верно отрабатывает.

Wind River Linux

echo $SHELL
/bin/tcsh


"Сравнить вывод двух команд, найти разницу"
Отправлено Seryoga2014 , 14-Ноя-17 11:03 
> echo $SHELL
> /bin/tcsh

Из под bash работает. Спасибо :)


"Сравнить вывод двух команд, найти разницу"
Отправлено ACCA , 18-Ноя-17 12:59 
> Wind River Linux
> echo $SHELL
> /bin/tcsh

Ты бы ещё psh от DataStage себе поставил. Стесняюсь предположить, как ты пользуешься задним отверстием...


"Сравнить вывод двух команд, найти разницу"
Отправлено Seryoga2014 , 23-Ноя-17 17:55 
>> Wind River Linux
>> echo $SHELL
>> /bin/tcsh
> Ты бы ещё psh от DataStage себе поставил. Стесняюсь предположить, как ты
> пользуешься задним отверстием...

Вообще-то это специализированная железка за гору денег, готовое решение, т.е. я там ничего не ставил, не выбирал, оно так было и что-то там менять, устанавливать своё крайне не желательно - железка на поддержке и с этим могут возникнуть проблемы. Специфичные команды работают полноценней из того, что стартует по умолчанию при подключении по ssh. Уж не знаю чем там руководствовались создатели, подбирая shell, но вероятно это не от балды, как и выбор дистрибутива.