加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

数组 – 在循环期间重新分配awk数组

发布时间:2020-12-14 00:43:37 所属栏目:Linux 来源:网络整理
导读:我的问题如下: 我有一个格式化的文本文件: 12 apple 78 orange 12 prune12 prune78 berries78 cake 我需要的是在表单中重新分配值: 12 apple,prune78 orange,berries,cake 我用awk {sbj = $2“,”; a [$1] = a [$1] sbj} END {for(i in a)print i,a [i]}
我的问题如下:
我有一个格式化的文本文件:

12 apple 
78 orange 
12 prune
12 prune
78 berries
78 cake

我需要的是在表单中重新分配值:

12 apple,prune
78 orange,berries,cake

我用awk {sbj = $2“,”; a [$1] = a [$1] sbj} END {for(i in a)print i,a [i]}
但问题是,现在我有了这个文件,格式为:

12 apple one
78 orange one

12 prune two
12 prune two
78 berries two
78 cake two

欲望输出是:

12 apple one
78 orange one

12 prune two
78 berries,cake two

我试图混合awk和bash,但它没有帮助.我现在唯一可以做的选择是将每个系列(“一个”,“两个”)存储到单独的文件中,并使用上面的代码单独处理它们,然后将所有数组汇总到一个文件中.但这是一个笨重而笨拙的解决方案.有没有选项让它在同一个文件中?
谢谢你的任何提示.

解决方法

$cat tst.awk
NF {
    if (!seen[$1,$2]++) {
        arr[$1] = ($1 in arr ? arr[$1] "," OFS : "") $2
        sfx[$1] = $3
    }
    next
}
{ prt() }
END { prt() }

function prt(   i) {
    for (i in arr) {
        print i,arr[i],sfx[i]
    }
    print ""
    delete sfx
    delete arr
    delete seen
}

$awk -f tst.awk file
12 apple one
78 orange one

12 prune two
78 berries,cake two

请注意,上面将按照随机顺序打印输出行 – 如果要保留原始输入顺序,则在保存值时需要额外的步骤.然而,它将以与它们在输入中出现的顺序相同的顺序打印块和$2值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读