如何使用awk打印特定数字后的所有列?

在shell中,当我需要一个特定的列时,我会将其拖到awk上。

这打印列9,例如:

... | awk '{print $9}' 

我怎么能告诉awk打印所有的列, 包括第9之后 ,而不是第9列?

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

当你想做一系列的字段时, awk并不是真的有一个简单的方法来做到这一点。 我会build议cut

 cut -d' ' -f 9- ./infile 

编辑

由于默认为选项卡,因此添加了空格字段分隔符。 感谢Glenn指出这一点

 awk '{print substr($0, index($0,$9))}' 
 sed -re 's,\s+, ,g' | cut -d ' ' -f 9- 

而不是处理可变宽度空格,请将所有空格replace为单个空格。 然后使用感兴趣的领域简单的cut

它不使用awk,所以不是密切相关的,但考虑到其他答案/评论似乎是合适的。

一般来说,perlreplaceawk / sed / grep et。 等等,而且更便携(以及只是一个更好的小刀)。

 perl -lane 'print "@F[8..$#F]"' 

Timtowtdi当然适用。

 awk -vm="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}' 

这将打印给定字段nr。,N之前的内容,并打印该行的所有其余部分,包括字段nr.N并保持原始间距(不重新格式化)。 如果字段的string也出现在行中的其他地方,这不是问题,这是Ascherer的答案。

定义一个函数:

 fromField () { awk -vm="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}' } 

像这样使用它:

 $ echo " bat bi iru lau bost " | fromField 3 iru lau bost $ echo " bat bi iru lau bost " | fromField 2 bi iru lau bost 

输出保持所有内容,包括尾随空格对于N = 0,它将返回整个行,并且n> NF表示空string

要显示前三个字段并打印您可以使用的剩余字段:

 awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename 

其中$ 1 $ 2 $ 3是前三个字段。

这是一个ls -l输出的例子:

 -rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4 -rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4 -rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4 -rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4 

我的解决scheme打印$9后的东西是awk '{print substr($0, 61, 50)}'

 function print_fields(field_num1, field_num2){ input_line = $0 j = 1; for (i=field_num1; i <= field_num2; i++){ $(j++) = $(i); } NF = field_num2 - field_num1 + 1; print $0 $0 = input_line } 
 ruby -lane 'print $F[3..-1].join(" ")' file