Wie kann ich die Ausgabe zweier Befehle mit einem Befehl zu einem zusammenführen?
command1-Ausgabe:
ID NAME1 COLUMN2
xxx-1 aaa bbb
xxx-2 ccc ddd
xxx-3 eee fff
xxx-4 nnn mmm
command2-Ausgabe:
COLUMN3 COLUMN4 ID
kkk www xxx-3
kkk ppp xxx-1
kkk qqq xxx-4
lll ttt xxx-2
kkk rrr xxx-2
HINWEIS: command1 xxx-2
Rückgaben ccc
(Feld NAME1)
Es wurde ein Befehl und eine Ersetzung auf dem Bildschirm erwartet, es sind keine Dateien beteiligt.
Erwartetes Ergebnis:
COLUMN3 COLUMN4 NAME1
kkk www eee
kkk ppp aaa
kkk qqq nnn
lll ttt ccc
kkk rrr ccc
Vielen Dank.
**
** BEARBEITET: 2 einfache Skripte mit den Ergebnissen jedes Befehls zum Testen hinzugefügt.
befehl1.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'
Antwort1
awk 'NR==FNR{a[$1]=$2; next} {$3=a[$3]} 1' <(command1) <(command2)
könnte sein, wonach Sie suchen.
Ich habe das oben genannte optimiert und erneut ausgeführt, da die beiden von Ihnen hinzugefügten Befehlsskripte die folgende Ausgabe erzeugen:
$ 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
Ich habe es so geschrieben, dass die Zuordnung funktioniert und die Ausgabe die gleichen Abstände wie die Eingabe beibehält, unabhängig davon, ob das 3. Feld des ersten Eingabestroms oder das 2. Feld des 2. Eingabestroms Leerzeichen enthält oder nicht, ob die Leerzeichen Leerzeichen oder Tabulatoren sind oder ob die Felder eine feste Breite haben oder nicht. Die einzigen Felder, die keine Leerzeichen enthalten dürfen, sind die Felder 1 und 2 von Eingabe 1 und Feld 3 von Eingabe 2.