Печать десяти значений из каждого массива, чередующихся между ними, пока оба не станут пустыми - PullRequest
1 голос
/ 25 марта 2019

Предположим, у меня есть следующий скрипт, и он перебирает два массива и печатает значения, чередующиеся между ними.Я передаю сценарию следующий файл:

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

Awk Script:

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 Ответ

1 голос
/ 25 марта 2019

по 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...