Заменить или объединить вывод двух команд в один, используя однострочную команду

Заменить или объединить вывод двух команд в один, используя однострочную команду

Как объединить вывод двух команд в один, используя одну команду?

вывод команды1:

ID      NAME1  COLUMN2
xxx-1   aaa    bbb     
xxx-2   ccc    ddd     
xxx-3   eee    fff     
xxx-4   nnn    mmm     

вывод команды2:

COLUMN3   COLUMN4   ID
kkk       www       xxx-3
kkk       ppp       xxx-1
kkk       qqq       xxx-4
lll       ttt       xxx-2
kkk       rrr       xxx-2

ПРИМЕЧАНИЕ: command1 xxx-2возвращает ccc(поле NAME1)

Ожидается, что на экране произойдет одна команда и замена, без задействованных файлов.

Ожидаемый результат:

COLUMN3   COLUMN4   NAME1
kkk       www       eee
kkk       ppp       aaa
kkk       qqq       nnn
lll       ttt       ccc
kkk       rrr       ccc

Большое спасибо.

**

** ОТРЕДАКТИРОВАНО: Добавлено 2 простых скрипта с результатами каждой команды для тестирования.

команда1.sh >

#!/bin/sh

if [[ -z "$1" ]]; then
  echo 'ID                                     NAME1                  COLUMN2
3cc45fe6-gqee-321f-c143-w3d1d278912c   aaa                    bbb bab bab
4a39466b-211d-48e2-a86b-db022c10fe59   ccc                    ddd ddd daa ddd
adw45fe6-fqxe-261g-k172-a7d1x277112d   eee                    fff fff
f28894d0-cf40-4cff-a19a-a6893f88dd67   nnn                    mmm mamm mmm'
elif [[ -n "$1" ]]; then
    if [[ "$1" == "3cc45fe6-gqee-321f-c143-w3d1d278912c" ]]; then
        echo "aaa"
    elif [[ "$1" == "4a39466b-211d-48e2-a86b-db022c10fe59" ]]; then
        echo "ccc"
    elif [[ "$1" == "adw45fe6-fqxe-261g-k172-a7d1x277112d" ]]; then
        echo "eee"
    elif [[ "$1" == "f28894d0-cf40-4cff-a19a-a6893f88dd67" ]]; then
        echo "nnn"
    else
        echo "Error from server (NotFound)"
    fi
fi

команда2.sh >

#!/bin/sh

echo 'COLUMN3    COLUMN4                                 ID
kkk        www wwaaw www www                       adw45fe6-fqxe-261g-k172-a7d1x277112d
kkk        pppppppppppp paaapp ppp ppp             3cc45fe6-gqee-321f-c143-w3d1d278912c
kkk        qqq qqq qqqqqqqqqqqqqqq                 f28894d0-cf40-4cff-a19a-a6893f88dd67
lll        tttttttttttt ttttttttt ttt ttt          4a39466b-211d-48e2-a86b-db022c10fe59
kkk        rrrrrr rrrrrr rrrraarrrrr rrr           4a39466b-211d-48e2-a86b-db022c10fe59'

решение1

awk 'NR==FNR{a[$1]=$2; next} {$3=a[$3]} 1' <(command1) <(command2)

возможно, это то, что вы ищете.

Я подправил вышеприведенный код и перезапустил его, учитывая вывод, который выдают два добавленных вами командных скрипта:

$ awk '
    NR==FNR { map[$1]=$2; next }
    { key=$NF; sub(/[^[:space:]]+[[:space:]]*$/,""); print $0 map[key] }
' <(./command1.sh) <(./command2.sh)
COLUMN3    COLUMN4                                 NAME1
kkk        www wwaaw www www                       eee
kkk        pppppppppppp paaapp ppp ppp             aaa
kkk        qqq qqq qqqqqqqqqqqqqqq                 nnn
lll        tttttttttttt ttttttttt ttt ttt          ccc
kkk        rrrrrr rrrrrr rrrraarrrrr rrr           ccc

Я написал его таким образом, что отображение будет работать, и вывод сохранит тот же интервал, что и ввод, независимо от того, есть ли пробелы в 3-м поле первого входного потока или во 2-м поле 2-го входного потока, являются ли пробелы пробелами или табуляциями, являются ли поля фиксированной ширины или нет. Единственными полями, которые не могут иметь пробелов, являются поля 1 и 2 ввода 1 и поле 3 ввода 2.

Связанный контент