我还是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+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