如何使用Awk将.ppm读取到3列的数组中



我还是awk的新手,我正在尝试使用awk将ppm文件读取为三列:示例:

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{
}

awk不是shell。这是一个完全不同的工具,它有自己的语法和语义,与C比shell更相似。在awk中,将1添加到名为count的变量中只是count+1,就像在C中一样,用$((...))包围它与在shell中具有完全不同的含义。如果count具有值3,则count+14,并且$((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

最新更新