我想使用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
毋庸置疑,它不起作用;-)任何人都可以提供帮助吗?
答案 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