在shell上,当我需要特定的列时,我通过管道传输到awk。
例如,打印第9列:
... | awk '{print $9}'
我怎样才能告诉awk打印包括第9列及之后的所有列,而不仅仅是第9列?
Answers:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
或perl
这样做更好。仅当您确实坚持要使用它时,才使用此功能awk
。
当您想要执行一系列字段操作时,awk
实际上并没有直接的方法。我建议cut
改为:
cut -d' ' -f 9- ./infile
由于默认为制表符,因此添加了空格字段定界符。感谢Glenn指出这一点
find . | xargs ls -l | cut -d' ' -f 9-
。由于某些原因,也会计算双倍空格。示例:lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
将导致./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
编辑:请注意,如果第九个字段之前的任何字段都包含与第九个相同的值,则此方法不起作用。
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
代替处理可变宽度的空格,将所有空格替换为单个空格。然后将simplecut
与感兴趣的字段一起使用。
它不使用awk,因此也不是紧密联系,但考虑到其他答案/评论,它似乎很合适。
ps faux |
使用。永远不要害怕使用XYZ工具不是最合适的工具。
通常,perl代替awk / sed / grep等。人,而且是很多更便携(以及刚刚成为一个更好的小刀)。
perl -lane 'print "@F[8..$#F]"'
Timtowtdi当然适用。
-l
,或添加\n
到打印语句。
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
这将对给定字段nr。,N之前的内容进行斩波,并打印该行的所有其余部分,包括字段nr.N并保持原始间距(不重新格式化)。如果字段的字符串也出现在行中的其他位置,则不会发生问题,这是Ascherer的问题。
定义一个函数:
fromField () {
awk -v m="\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,则返回空字符串
这是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
我打印任何内容的解决方案$9
是awk '{print substr($0, 61, 50)}'
要显示前三个字段并打印其余字段,可以使用:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
其中$ 1 $ 2 $ 3是前3个字段。