Как я могу прочитать .ppm в массиве из 3 столбцов с помощью Awk - PullRequest
1 голос
/ 06 мая 2020

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

P3
# feep.ppm
4 4
15
 0  0  0    0  0  0    0  0  0   15  0 15
 0  0  0    0 15  7    0  0  0    0  0  0
 0  0  0    0  0  0    0 15  7    0  0  0
15  0 15    0  0  0    0  0  0    0  0  0

Я хочу получить столбцы, содержащие

P3
# feep.ppm
4 4
15
0 0 0
0 0 0
0 0 0
15 0 15
P3
# feep.ppm
4 4
15
0 0 0
0 15 7
0 0 0
0 0 0

и так до конца числовых полей. мой код выглядит следующим образом:

BEGIN{
    #fieldsep=" ";
}
NR>0{
    count = 0;
    while(count < NF){
        print $((count +1)), $((count+2)), $((count+3));
        count +=3;
    }

}

END{

}

1 Ответ

2 голосов
/ 06 мая 2020

awk не является оболочкой. Это совершенно другой инструмент с собственным синтаксисом и семантикой, которые гораздо больше похожи на C, чем на оболочку. Добавление 1 к переменной с именем count в awk - это просто count+1, как и в C, окружение этого с помощью $((...)) имеет совершенно другое значение, чем в оболочке. Если count имеет значение 3, тогда count+1 равно 4 и $((count+1)) = $((3+1)) = $((4)) = $4 = любое значение, которое имеет ваше 4-е поле ввода.

$ cat tst.awk
NR<5 { hdr = (NR>1 ? hdr ORS : "") $0; next }
{
    ++numRows
    numCols = 3
    numBlocks = NF / numCols
    fldNr = 1
    for (blockNr=1; blockNr<=numBlocks; blockNr++) {
        for (colNr=1; colNr<=numCols; colNr++) {
            vals[blockNr,numRows] = (colNr>1 ? vals[blockNr,numRows] OFS : "") $(fldNr++)
        }
    }
}
END {
    for (blockNr=1; blockNr<=numBlocks; blockNr++) {
        print hdr
        for (rowNr=1; rowNr<=numRows; rowNr++) {
            print vals[blockNr,rowNr]
        }
        print ""
    }
}

.

$ awk -f tst.awk file
P3
# feep.ppm
4 4
15
0 0 0
0 0 0
0 0 0
15 0 15

P3
# feep.ppm
4 4
15
0 0 0
0 15 7
0 0 0
0 0 0

P3
# feep.ppm
4 4
15
0 0 0
0 0 0
0 15 7
0 0 0

P3
# feep.ppm
4 4
15
15 0 15
0 0 0
0 0 0
0 0 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...