Vergleichen Sie zwei Spalten aus zwei verschiedenen Dateien und zeigen Sie die Ausgabe in einer neuen Datei an

Vergleichen Sie zwei Spalten aus zwei verschiedenen Dateien und zeigen Sie die Ausgabe in einer neuen Datei an

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 $1Ihr Schlüsselfeld in file2.txtist $1, nicht $2.
  • Die Reihenfolge der Felder, die Sie Ihrem zuweisen, arrist vertauscht. Im ersten Teil weisen Sie zu $2 $1, der zweite Teil ist $2 $3, sollte aber $3 $2dann 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

verwandte Informationen