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