Datei1.txt
psid task status
1 a1 run
2 a2 run
3 a3 stop
4 a4 run
5 a5 stop
Datei2.txt
a1 stop
a2 stop
a3 run
a4 run
a5 stop
Ausgabe -
task status ok
a1 run nok
a2 run nok
a3 stop nko
a4 run ok
a5 stop ok
Ich möchte die Aufgaben- und Statusspalten von Datei1 und Datei2 vergleichen und die Daten in einer neuen Datei mit Aufgabe und Status und der Zeichenfolge anzeigen, als ob sie gleich wären, dann „ok“, wenn nicht „nok“
Das habe ich versucht, aber es funktioniert nur bei der Bedingung „false“, aber auch bei „true“ wird „false“ angezeigt.
awk -F, 'NR==FNR{ arr[$2]=$2 $1; next }
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt
Antwort1
Schauen wir uns also an, was Sie versucht haben:
awk -F, 'NR==FNR{ arr[$2]=$2 $1; next }
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt
-F,
Setzt das Feldtrennzeichen auf ein Komma, was falsch ist, wenn Sie sich Ihre Dateien ansehen.arr[$2]=$2 $1
Ihr Schlüsselfeld infile2.txt
ist$1
, nicht$2
.- Die Reihenfolge der Felder, die Sie Ihrem zuweisen,
arr
ist vertauscht. Im ersten Teil weisen Sie zu$2 $1
, der zweite Teil ist$2 $3
, sollte aber$3 $2
dann sein. Oder umgekehrt, der erste Teil$1 $2
--
Aberwarum nicht nur den Run/Stop-Wert zuweisen, das sollte reichen!
Die Version, die Ihrer Lösung am nächsten kommt, wäre also:
awk 'NR==FNR{ arr[$1]=$2 $1; next }
{ print $0, (arr[$2]==$3 $2?"ok":"nok") }' OFS=, file2.txt file1.txt
Aber ich würde Folgendes nehmen:
awk '
NR==FNR{ arr[$1]=$2;next;}
FNR>2{ print $2,$3,(arr[$2]==$3?"ok":"nok") }
' file2.txt file1.txt