循环后awk替换

时间:2017-03-23 14:18:29

标签: bash awk gawk

我想使用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 ($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

毋庸置疑,它不起作用;-)任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分: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

假设第二个字段是父ID。

答案 1 :(得分:0)

好吧,如果您的数据按降序排序(如果没有排序,则可以使用sort,如果数据按升序排序,则可以使用rev),这足以哈希第一个在$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