2017-03-23 1 views
1

このソリューションは、大規模なデータソースに適用可能な一般的なものでなければなりません。親レコードは$ 1 == $ 2で定義されます。awkがafterループを置き換えます。awkを使用してchild_valueをparent_valueで上書きしたいとします。

これは私の入力ファイル(フォーマット:ID VALUE; PARENT_ID):ある

10;20;parent_value 
20;20;parent_value 

は、これは私の現在のアプローチです:

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 
これは私が望む結果である

10;20;child_value 
20;20;parent_value 

言うまでもなく、それはそのようには動作しません;-)だれでも助けてくれますか?非連続的なラインで、おそらく複数の親/子ペアの

+1

'child_value'は定数または動的値ですか?それには複数の子 - 親値がありますか?もしそうなら、親とその子供とのマッチング方法は? – sat

+0

子供は子供を持つことができますか(すなわち、「5; 10; typical_teen_value')? 'parent_value'または' child_value'を取得しますか? –

+0

@JamesBrown再帰はありません – user2043423

答えて

1

...

$ 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 

は、2番目のフィールドは、親IDで想定しています。あなたのデータはdescnding順にソートされている場合、処理前に

+0

このソリューションは完全に機能します。多くのおかげで@ karakfa! – user2043423

0

まあ、(データが昇順にソートされている場合、すべてまたはrevでソートされていない場合は、sortを使用することができます)、それは$2に各キーの最初のエントリをハッシュするのに十分だと$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 
関連する問題