如何使用awk在特定编号之后打印所有列?


Answers:


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

3
进行了一些细化:awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
glenn jackman 2011年

谢谢@glenn,的确确实有些普遍。无论如何-我一定会同意使用它cutperl这样做更好。仅当您确实坚持要使用它时,才使用此功能awk
阿玛丹

1
@SiegeX:它不添加NUL字节,而是将FS留在每个空白字段之间。
暂停,直到另行通知。

1
请参阅@Ascherer的答案以获得优雅。

3
@veryhungrymike:优雅很好,但我宁愿正确。:p
阿玛丹

68

当您想要执行一系列字段操作时,awk实际上并没有直接的方法。我建议cut改为:

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

编辑

由于默认为制表符,因此添加了空格字段定界符。感谢Glenn指出这一点


15
关于cut的一件事是,它使用了特定的定界符(默认情况下为制表符),其中awk使用“空格”。剪切时,两个连续的制表符分隔一个空字段。
glenn jackman 2011年

1
正如@glennjackman指出的那样,awk的分隔符是“空白”(也可以是任意数量)。因此,将cut分隔符设置为单个空格也不会匹配行为。不幸的是,循环是最好的循环,因此看起来很不错。
庞恰

这一个不能正常工作。尝试命令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
Marco Pashkov

@MarcoPashkov请详细说明这一代码无法正常工作,尤其是考虑到您在管道中使用完全相同的代码。顺便说一句,您永远不要尝试解析ls的输出
SiegeX

剪切在这里不起作用。例如,如果您输入的是一行的“ foo bar”(单个空格),而另一行的输入是“ foo ___ bar”(即多个空格,但是SO太聪明了,无法显示出来),则cut将以不同的方式处理它们。
UKMonkey

54
awk '{print substr($0, index($0,$9))}'

编辑:请注意,如果第九个字段之前的任何字段都包含与第九个相同的值,则此方法不起作用。


3
这是一个辉煌!

10
@veryhungrymike:...并且如果第九个之前的任何字段包含与第九个相同的值将不起作用。
阿玛丹

6
可能是因为经典的句子“希望您的文件没有该问题”。s / w工程完全禁止“我们不会浪费时间,例如对输入负值进行错误检查,因为'我们希望用户足够聪明,不要尝试,导致我们的工具崩溃”。哈哈哈!总是喜欢听到这个!(我喜欢一种幽默感)好吧,因为确实存在白痴,所以开发人员有责任使自己的东西成为白痴!而不是“为人类的美好希望”。这是相当期待与哲学家的态度,而不是S / W工程师...... LOL
的SyntaxError

3
我并不是说不检查错误,但如果您知道自己不会遇到问题,那么此解决方案就可以了,就像我说的那样。但是,谢谢您不必要的downvote @syntaxerror。该解决方案将在某些情况下有效,如(目前)有19个投票将显示,但如果没有,则不要在您的解决方案中使用它。有很多方法可以解决OP的问题。
Ascherer 2014年

1
如果您在日常工作中在命令行上使用awk,则绝对是您想要的解决方案。这不是很明显吗?在这种情况下,错误检查等并不重要,因为您可以在其中键入它,并且可以在按Enter键之前捕获到此类问题(个人而言,我认为awk也不应该用于其他任何事情,这就是为什么'已经有了perl,python,tcl以及大约100多种其他更好,更好,更快,更烦人的脚本语言!)即时(??)
osirisgothra'Aug

11
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-

代替处理可变宽度的空格,将所有空格替换为单个空格。然后将simplecut与感兴趣的字段一起使用。

它不使用awk,因此也不是紧密联系,但考虑到其他答案/评论,它似乎很合适。


1
请让您的答案更彻底,否则将其发布为对该问题的评论。
Alper Turan 2015年

这是理想的ps faux | 使用。永远不要害怕使用XYZ工具不是最合适的工具。
凯文夫'16

10

通常,perl代替awk / sed / grep等。人,而且是很多更便携(以及刚刚成为一个更好的小刀)。

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

Timtowtdi当然适用。


您需要添加命令行选项-l,或添加\n到打印语句。
glenn jackman 2011年

@glenn jackman:可能。如果是另一条消息的一部分,或者被分配给变量等,则不需要。就“更好”而言,perl看上去肯定更好。诚然在大可以看起来很凌乱。
bobbogo 2011年

不要误会我的意思,我喜欢Perl。我爱awk,尽管它是什么。
glenn jackman 2011年

我的嵌入式设备没有Perl,但确实有awk。
Sepero 2014年

拒绝投票是因为这个问题问如何在awk中执行此操作,而不是perl,ruby,java,python,bash。
汤姆·哈里森

3
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,则返回空字符串


这是一个好主意。它在当前使用典型gawk的Mac上无法正常工作,因为$ 0崩溃了。解决方法是第一步将变量设置为$ 0,例如:'{s = $ 0; ... print substr(s,index(s,m)+1}
joelparkerhenderson

1

这是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

我打印任何内容的解决方案$9awk '{print substr($0, 61, 50)}'


0
ruby -lane 'print $F[3..-1].join(" ")' file

0

要显示前三个字段并打印其余字段,可以使用:

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

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


0
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
}

0

使用cut而不是awk可以解决问题,通过使用-c character cut命令可以确定从哪一列开始。

我在这里说的是,除了输出的前49个字符外,请给我所有的字符。

 ls -l /some/path/*/* | cut -c 50-

/*/*/在ls命令结束时说,告诉我什么是子目录太。

您还可以拉出某些范围的字符ala(从cut手册页中)。例如,显示当前登录用户的名称和登录时间:

       who | cut -c 1-16,26-38
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.