AWK повторяется на 2?например, 1,1,2,2,3,3 - PullRequest
0 голосов
/ 22 февраля 2019

ОБНОВЛЕНИЕ: добавлены дополнительные данные, чтобы прояснить вопрос ...

У меня есть, как мне кажется, очень простой вопрос, на который я пытаюсь найти ответ.

Я печатаю строку определенное количество раз на основе значения в определенном столбце.Вот пример файла (тест):

#head test

10104 Baja  2
1021 Baja  4
10268 Baja  2
10459 Baja  2
1053 Baja  4
222 Baja 6

Я добавляю дополнительные столбцы и информацию и печатаю каждую строку несколько раз в зависимости от значения 3-го столбца:

awk '{for(i=1;i<=$3;i++)print $1,$2,"Bj"i,"??????"}' OFS="\t" testt

10104   Baja    Bj1 ??????
10104   Baja    Bj2 ??????
1021    Baja    Bj1 ??????
1021    Baja    Bj2 ??????
1021    Baja    Bj3 ??????
1021    Baja    Bj4 ??????
10268   Baja    Bj1 ??????
10268   Baja    Bj2 ??????
10459   Baja    Bj1 ??????
10459   Baja    Bj2 ??????
1053    Baja    Bj1 ??????
1053    Baja    Bj2 ??????
1053    Baja    Bj3 ??????
1053    Baja    Bj4 ??????
222     Baja    Bj1 ??????
222     Baja    Bj2 ??????
222     Baja    Bj3 ??????
222     Baja    Bj4 ??????
222     Baja    Bj5 ??????
222     Baja    Bj6 ??????`

Я добавил итератор «i» после текста «Bj», чтобы подсчитать метку, но мне бы очень хотелось повторять так: 1,1,2,2,3,3 и т. Д. (В группах по два: если 8напечатанные строки будут иметь значение 1,1,2,2,3,3,4,4 и т. д.), поэтому полученный текст будет выглядеть следующим образом:

10104   Baja    Bj1 ??????
10104   Baja    Bj1 ??????
1021    Baja    Bj1 ??????
1021    Baja    Bj1 ??????
1021    Baja    Bj2 ??????
1021    Baja    Bj2 ??????
10268   Baja    Bj1 ??????
10268   Baja    Bj1 ??????
10459   Baja    Bj1 ??????
10459   Baja    Bj1 ??????
1053    Baja    Bj1 ??????
1053    Baja    Bj1 ??????
1053    Baja    Bj2 ??????
1053    Baja    Bj2 ??????
222     Baja    Bj1 ??????
222     Baja    Bj1 ??????
222     Baja    Bj2 ??????
222     Baja    Bj2 ??????
222     Baja    Bj3 ??????
222     Baja    Bj3 ??????``

В действительности (реальные данные)числа в столбце 3 все четные, поэтому итератор всегда будет сгруппирован по 2.

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Я бы просто использовал внутренний цикл

awk '{
    for (i=1; i <= $3/2; i++)
        for (j=1; j<=2; j++)
            print $1,$2,"Bj"i,"??????"
}' OFS="\t" testt
0 голосов
/ 22 февраля 2019

другой awk с петлей while.

$ awk -v OFS='\t' '{k=1; while(k++<=$3) print $1,$2,"Bj"int(k/2),"??????"}' file

10104   Baja    Bj1     ??????
10104   Baja    Bj1     ??????
1021    Baja    Bj1     ??????
1021    Baja    Bj1     ??????
1021    Baja    Bj2     ??????
1021    Baja    Bj2     ??????
10268   Baja    Bj1     ??????
10268   Baja    Bj1     ??????
10459   Baja    Bj1     ??????
10459   Baja    Bj1     ??????
1053    Baja    Bj1     ??????
1053    Baja    Bj1     ??????
1053    Baja    Bj2     ??????
1053    Baja    Bj2     ??????
222     Baja    Bj1     ??????
222     Baja    Bj1     ??????
222     Baja    Bj2     ??????
222     Baja    Bj2     ??????
222     Baja    Bj3     ??????
222     Baja    Bj3     ??????
0 голосов
/ 22 февраля 2019

Это то, что вы пытаетесь сделать?

$ awk -v OFS='\t' '{ j=1; for(i=1;i<=$3;i++) {print $1,$2,"Bj"j,"??????"; if (!(i%2)) j++} }' file
10104   Baja    Bj1     ??????
10104   Baja    Bj1     ??????
1021    Baja    Bj1     ??????
1021    Baja    Bj1     ??????
1021    Baja    Bj2     ??????
1021    Baja    Bj2     ??????
10268   Baja    Bj1     ??????
10268   Baja    Bj1     ??????
10459   Baja    Bj1     ??????
10459   Baja    Bj1     ??????
1053    Baja    Bj1     ??????
1053    Baja    Bj1     ??????
1053    Baja    Bj2     ??????
1053    Baja    Bj2     ??????
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...