从每个数组中交替打印十个值,直到两个都为空

时间:2019-03-25 11:10:01

标签: linux awk

假设我有以下脚本,它正在两个数组上进行迭代,并打印出在两个数组之间交替显示的值。我向脚本提供了以下文件:

1 2
1 2
1 2
1 2
1 2
1 2

Awk脚本:

BEGIN{ FS = "\t" }
{ a[o++]=$1; b[c++]=$2 }
END{ while (++co <= 5 ) { 
        for ( k = 1+count; k <= 2+count; k++ ){ if (length(a) >= 0){ print a[k]; delete a[k]} }
        for ( ki = 1+count; ki <= 2+count; ki++ ){ if (length(b) >= 0){ print b[ki]; delete b[ki] } }
        count = k
    }
}

我希望输出为

1
1
2
2
1
1
2
2
1
1
2
2

但是我得到的是:

1
1
2
2
1
1
2
2

(followed by blank lines but they are not my issue)

那么如何使它运行直到两个数组都为空并且所有内容都打印完为止。以及即使数组大小不同也如何使其工作,例如一个例如比其他多20个值。因此,仅应打印这些值,直到数组为空。

1 个答案:

答案 0 :(得分:1)

wrt how to make it run until both arrays are empty-无需删除数组内容。

wrt just these values should be printed until the array is empty-“ 数组为空”可能意味着只打印两个数组中存在的索引处的值(“ 第一个数组为空” “),或者可能意味着打印两个数组中的所有值(” 两个数组均为空“)。下面的脚本假定使用后者,但是可以很容易地对其进行调整(将||更改为&&)。

$ cat tst.awk
{ a[++maxA]=$1; b[++maxB]=$2 }
END {
    while ( (prevEnd<maxA) || (prevEnd<maxB) ) {
        prt(a)
        prevEnd = prt(b)
    }
}

function prt(arr,       idx) {
    for (idx=prevEnd+1; idx<=prevEnd+2; idx++) {
        if (idx in arr) {
            print arr[idx]
        }
    }
    return (idx-1)
}

$ awk -f tst.awk file
1
1
2
2
1
1
2
2
1
1
2
2