awk - 从第n 个到最后,使用awk输出所有列


svn status | grep '!' | gawk '{print $2;}' > removedProjs

有没有办法让awk在$2或更大范围内打印所有内容? ($3,$4. .直到最后的列),

我补充一点,我正在cygwin的Windows环境中执行此操作。

时间:

打印除第一列之外的所有内容:


awk '{$1=""; print $0}' somefile

将打印除两列外的所有列:


awk '{$1=$2=""; print $0}' somefile


 svn status | grep '!' | cut -d -f2-

d指定分隔符(空格),f指定列列表(均从第二列开始),

由于"print"附加换行符,你将需要缓冲结果:


awk '{out=""; for(i=2;i<=NF;i++){out=out""$i}; print out}'

或者,使用printf :


awk '{for(i=2;i<=NF;i++){printf"%s", $i}; printf"n"}'


awk '{out=$2; for(i=3;i<=NF;i++){out=out""$i}; print out}'

我亲自尝试了上述所有答案,但是大多数都是复杂的或者不正确,从我的角度来看,最简单的方法是:


awk -F"" '{ for (i=4; i<=NF; i++) print $i }'

  1. F定义awk要使用的分隔符,这里是空格,它也是awk的缺省分隔符,这意味着F可以忽略。

  2. NF定义字段/列的总数,因此循环将从第四个字段开始到最后一个字段/列。

  3. 其中$N检索第n个字段的值,因此打印$i将基于循环计数打印当前字段/列。

输出从#2 (输出在开始时没有尾随空格)开始的列:


ls -l | awk '{sub(/[^ ]+ /,""); print $0}'

首先,创建一个叫pfcut的新awk库脚本,例如,


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);
}


echo"1 2 3 4 5 6" | awk '{ $NF =""; print $0}'

从第六列到最后列的打印。


ls -lthr | awk '{out=$6; for(i=7;i<=NF;i++){out=out""$i}; print out}'

或者


ls -lthr | awk '{ORS=""; for(i=6;i<=NF;i++) print $i;print"n"}'


@m=`ls -ltr dir | grep ^d | awk '{print $6,$7,$8,$9}'`;
foreach $i (@m)
{
 print"$in";

}

...