한 줄 명령을 사용하여 두 명령의 출력을 하나로 대체하거나 병합합니다.

한 줄 명령을 사용하여 두 명령의 출력을 하나로 대체하거나 병합합니다.

하나의 명령을 사용하여 두 명령의 출력을 하나로 병합하려면 어떻게 해야 합니까?

command1 출력:

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

command2 출력:

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

참고: (NAME1 필드)를 command1 xxx-2반환합니다 .ccc

화면에 하나의 명령과 대체가 발생할 것으로 예상되며 관련된 파일은 없습니다.

예상 결과:

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

정말 감사합니다.

**

** 편집됨: 테스트를 위해 각 명령의 결과가 포함된 2개의 멍청한 스크립트를 추가했습니다.

command1.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

command2.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)

당신이 찾고있는 것일 수도 있습니다.

추가한 2개의 명령 스크립트가 생성하는 출력에 따라 위의 내용을 조정하고 다시 실행했습니다.

$ 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

매핑이 작동하고 첫 번째 입력 스트림의 세 번째 필드 또는 두 번째 입력 스트림의 두 번째 필드에 공백이 있는지 여부 또는 공백이 공백이나 탭인지 여부에 관계없이 출력이 입력과 동일한 간격을 유지하도록 작성했습니다. 또는 필드가 고정 너비인지 여부. 공백을 가질 수 없는 유일한 필드는 입력 1의 필드 1과 2, 입력 2의 필드 3입니다.

관련 정보