linux awk 打印最后一列,使用awk打印从第n个到最后一个的所有列

sdaau..

6

这让我非常恼火,我坐下来写了一个类似cut的字段规范解析器,用GNU Awk 3.1.7测试.

首先,创建一个名为的新Awk库脚本pfcut,例如

sudo nano /usr/share/awk/pfcut

然后,粘贴下面的脚本,然后保存.之后,这是用法的样子:

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("-4"); }'

t1 t2 t3 t4

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("2-"); }'

t2 t3 t4 t5 t6 t7

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("-2,4,6-"); }'

t1 t2 t4 t6 t7

$ echo "alias awk-pfcut='awk -f pfcut --source'" >> ~/.bashrc

$ source ~/.bashrc # refresh bash aliases

...然后你可以打电话:

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk-pfcut '/^/ { pfcut("-2,4,6-"); }'

t1 t2 t4 t6 t7

这是pfcut脚本的来源:

# pfcut - print fields like cut

#

# sdaau, GNU GPL

# Nov, 2013

function spfcut(formatstring)

{

# parse format string

numsplitscomma = split(formatstring, fsa, ",");

numspecparts = 0;

split("", parts); # clear/initialize array (for e.g. `tail` piping into `awk`)

for(i=1;i<=numsplitscomma;i++) {

commapart=fsa[i];

numsplitsminus = split(fsa[i], cpa, "-");

# assume here a range is always just two parts: "a-b"

# also assume user has already sorted the ranges

#print numsplitsminus, cpa[1], cpa[2]; # debug

if(numsplitsminus==2) {

if ((cpa[1]) == "") cpa[1] = 1;

if ((cpa[2]) == "") cpa[2] = NF;

for(j=cpa[1];j<=cpa[2];j++) {

parts[numspecparts++] = j;

}

} else parts[numspecparts++] = commapart;

}

n=asort(parts); outs="";

for(i=1;i<=n;i++) {

outs = outs sprintf("%s%s", $parts[i], (i==n)?"":OFS);

#print(i, parts[i]); # debug

}

return outs;

}

function pfcut(formatstring) {

print spfcut(formatstring);

}