2017-03-23 6 views
1

Ich möchte den Child_value mit dem Parent_value mit awk überschreiben. Die Lösung muss generisch für größere Datenquellen sein. Der Eltern-Datensatz ist definiert durch $ 1 == $ 2.Awk ersetzen nach Schleife

Dies ist meine Eingabedatei (Format: ID; PARENT_ID; VALUE):

10;20;child_value 
20;20;parent_value 

Dies ist das Ergebnis Ich mag:

10;20;parent_value 
20;20;parent_value 

Das ist mein aktueller Ansatz ist:

awk -F\; 
     BEGIN { 
      OFS = FS 
     } 
     { 
      if ($1 == $2) { 
       mapping[$1] = $3 
      } 
      all[$1]=$0 
     } 
     END { 
      for (i in all) { 
       if (i[$3] == 'child_value') { 
       i[$3] = mapping[i] 
       } 
       print i 
      } 
     } 
    ' file.in 

Unnötig zu sagen, dass es nicht so funktioniert ;-) Kann jemand helfen?

+1

ist 'child_value' konstant ist oder dynamischer Wert? Wird es mehr als einen Kind-Eltern-Wert haben? Wenn ja, wie wird das übergeordnete Element und das entsprechende untergeordnete Element abgeglichen? – sat

+0

Kann ein Kind ein Kind haben (z. B. "5; 10; typical_teen_value")? Erhält es 'parent_value' oder' child_value'? –

+0

@JamesBrown gibt es keine Rekursion – user2043423

Antwort

1

für mehrere Eltern/Kind-Paaren vielleicht auf nicht aufeinanderfolgende Zeilen ...

$ awk -F\; -v OFS=\; 'NR==FNR {if($1==$2) a[$2]=$3; next} 
         $1!=$2 {$3=a[$2]}1' file{,} 

10;20;parent_value 
20;20;parent_value 

nimmt das zweite Feld die übergeordnete ID ist.

+0

Diese Lösungen funktioniert einwandfrei. Vielen Dank @karakfa! – user2043423

0

Nun, wenn Sie Ihre Daten in descnding Reihenfolge sortiert sind (Sie sort verwenden könnten, wenn nicht sortiert oder rev wenn Daten in aufsteigender Reihenfolge sortiert sind) vor der Verarbeitung, es ist genug, um den ersten Eintrag jeder Taste in $2 Hash und verwenden Sie den Wert auf dem ersten Spiel für die folgenden Sätze mit dem gleichen Schlüssel in $2:

$ sort -t\; -k2nr -k1nr bar | \ 
awk ' 
BEGIN{ 
    FS=OFS=";" 
} 
{ 
    if($2 in a)  # if $2 in hash a, use it 
     $3=a[$2]  
    else    # else add it 
     a[$2]=$3 
    if(p!=$2)  # delete previous entries from wasting memory 
     delete a[p] 
    p=$2    # p is for previous on next round 
}1' 
20;20;parent_value 
10;20;parent_value