假设我有以下脚本,它正在两个数组上进行迭代,并打印出在两个数组之间交替显示的值。我向脚本提供了以下文件:
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个值。因此,仅应打印这些值,直到数组为空。
答案 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