【问题标题】:merge sorted arrays with their origin annotated合并已排序的数组及其原点注释
【发布时间】:2023-02-26 14:50:29
【问题描述】:

给定两个排序数组(下面是一个示例),我想将它们与它们来自何处的信息合并到一个数组中。

x1[1]=10
x1[2]=20
x1[3]=30

x2[1]=15
x2[2]=25
x2[3]=35

输出应该是这样的。

x[1]=10
x[2]=15
x[3]=20
x[4]=25
x[5]=30
x[6]=35
a[1]=1
a[2]=2
a[3]=1
a[4]=2
a[5]=1
a[6]=2

我怎样才能使 awk 函数有效地完成这项工作?

function f(r, a, x1, x2) {
# r output merge array
# a an annotation array indicating whether an element at a given index is from x1 or x2
# x1,x2 input sorted arrays
  ...
}

【问题讨论】:

  • 您显示的示例数组在bashawk 中均有效;你能确认你正在寻找一个纯粹的awk 解决方案吗?换句话说,你是不是希望使用 awk 合并一些 bash 数组,对吗?
  • 请使用您的awk 版本更新问题(例如awk --version 的输出)
  • 都是输入数组保证1n 编入索引,编号之间没有间隔?

标签: awk


【解决方案1】:

假设 awk 数组都从索引 1 开始并且不包含间隙:

awk '
    BEGIN {
        x1[1]=10; x1[2]=20; x1[3]=30
        x2[1]=15; x2[2]=25; x2[3]=35

        n = f(r,a,x1,x2)

        for ( i = 1; i <= n; i++ )
            print "x[" i "]=" r[i]

        for ( i = 1; i <= n; i++ )
            print "a[" i "]=" a[i]
    }
    function f(r,a,x1,x2,    i,i1,i2) {
        delete r
        delete a
        i = 0
        i1 = i2 = 1
        while ( (i1 in x1) && (i2 in x2) )
            if ( x1[i1] <= x2[i2] ) {
                a[++i] = 1
                r[i] = x1[i1++]
            } else {
                a[++i] = 2
                r[i] = x2[i2++]
            }
        while ( i1 in x1 ) {
            a[++i] = 1
            r[i] = x1[i1++]
        }
        while ( i2 in x2 ) {
            a[++i] = 2
            r[i] = x2[i2++]
        }
        return i
    }
'

输出:

x[1]=10
x[2]=15
x[3]=20
x[4]=25
x[5]=30
x[6]=35
a[1]=1
a[2]=2
a[3]=1
a[4]=2
a[5]=1
a[6]=2

编辑:我无法对解决方案发表评论。但它看起来不错。你为什么要删除它?

Edit2:您再次删除它并评论“通过投票”。 “通过投票”是什么意思?

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多