如何使用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