Есть две некие команды, которые выдают довольно большой объём данных в виде таблиц. Таблицы разные, но в них есть схожая информация. В первой таблице среди прочего в двух столбцах есть комбинации неких чисел и во второй, в других столбцах и строчках есть такие же пары. Мне надо найти разницу - некоторых пар чисел не хватает, надо найти каких именно.Как выделить из вывода каждой из команд нужные мне пары чисел и вывести их - я знаю (допустим, с помощью awk). Но как их потом сравнить между собой и, желательно, без промежуточных файлов? Как-то можно в grep прикрутить вывод другой команды, отфильтрованный с помощью awk? Или ещё какие-то методы есть?
Тебя понять невозможно. Покажи пример -
* кусок первой таблицы
* кусок второй
* результат
Таблица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. Надеюсь понятней объяснил на этот раз.
Таблица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Пардон, так правильней )
Ну, как-то так: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 - убедись, что ты понимаешь что он тебе ответил.
Спасибо. Я бы такую конструкцию вряд ли бы сочинил (про 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.Буду разбираться..
> Спасибо. Я бы такую конструкцию вряд ли бы сочинил (про 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.
> Буду разбираться..
> этом), а создаются два файла 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.
если еще актуально, нужно у автора уточнить что за ОС и её версия, и в каком шеле запускает.
У мена на Rhel 7.4 данная команда так же верно отрабатывает.
> если еще актуально, нужно у автора уточнить что за ОС и её
> версия, и в каком шеле запускает.
> У мена на Rhel 7.4 данная команда так же верно отрабатывает.Wind River Linux
echo $SHELL
/bin/tcsh
> echo $SHELL
> /bin/tcshИз под bash работает. Спасибо :)
> Wind River Linux
> echo $SHELL
> /bin/tcshТы бы ещё psh от DataStage себе поставил. Стесняюсь предположить, как ты пользуешься задним отверстием...
>> Wind River Linux
>> echo $SHELL
>> /bin/tcsh
> Ты бы ещё psh от DataStage себе поставил. Стесняюсь предположить, как ты
> пользуешься задним отверстием...Вообще-то это специализированная железка за гору денег, готовое решение, т.е. я там ничего не ставил, не выбирал, оно так было и что-то там менять, устанавливать своё крайне не желательно - железка на поддержке и с этим могут возникнуть проблемы. Специфичные команды работают полноценней из того, что стартует по умолчанию при подключении по ssh. Уж не знаю чем там руководствовались создатели, подбирая shell, но вероятно это не от балды, как и выбор дистрибутива.