1行のコマンドを使用して、2つのコマンドの出力を1つに置き換えたり結合したりする

1行のコマンドを使用して、2つのコマンドの出力を1つに置き換えたり結合したりする

1 つのコマンドを使用して、2 つのコマンドの出力を 1 つにマージするにはどうすればよいですか?

コマンド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 フィールド)

画面上で 1 つのコマンドと置換が実行され、ファイルは関係しないことが予想されます。

期待される結果:

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)

あなたが探しているものかもしれません。

上記を微調整し、追加した 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

私は、最初の入力ストリームの 3 番目のフィールドまたは 2 番目の入力ストリームの 2 番目のフィールドにスペースがあるかどうか、スペースが空白またはタブであるかどうか、またはフィールドが固定幅であるかどうかに関係なく、マッピングが機能し、出力が入力と同じスペースを保持するように記述しました。スペースを持つことができないフィールドは、入力 1 のフィールド 1 と 2、および入力 2 のフィールド 3 のみです。

関連情報