awk 循环后替换

Awk replace after loop

我想使用 awk 用 parent_value 覆盖 child_value。该解决方案必须通用适用于更大的数据源。父记录由 $1==$2.

定义

这是我的输入文件(格式:ID;PARENT_ID;VALUE):

10;20;child_value
20;20;parent_value

这是我想要的结果:

10;20;parent_value
20;20;parent_value

这是我目前的做法:

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

不用说,它不是那样工作的;-)有人可以帮忙吗?

对于多个 parent/child 对,可能在非连续行上...

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

10;20;parent_value
20;20;parent_value

假定第二个字段是父 ID。

好吧,如果你的数据在处理之前是按降序排列的(如果根本没有排序,你可以使用 sort 或者如果数据是按升序排列的,你可以使用 rev),那么哈希就足够了</code> 中每个键的第一个条目,并使用 <code> 中具有相同键的以下记录的第一个匹配项的值:

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