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

Laz*_*zer 79 shell awk

在shell上,当我需要一个特定的列时,我会输入awk.

这打印了第9列,例如:

... | awk '{print $9}'
Run Code Online (Sandbox Code Playgroud)

如何告诉awk打印所有列,包括和列9之后,而不仅仅是第9列?

Ama*_*dan 78

awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
Run Code Online (Sandbox Code Playgroud)

  • 一些细微的改进:`awk -v N = 9'{sep =""; for(i = N; i <= NF; i ++){printf("%s%s",sep,$ i); 九月= OFS}; 的printf( "\n")}"` (3认同)
  • @veryhungrymike:优雅很好,但我宁愿做对.:p (3认同)
  • 请参阅@Ascherer 的优雅回答。 (2认同)

Sie*_*geX 60

当你想要做一系列领域时,awk并没有真正有直接的方法来做到这一点.我建议cut改为:

cut -d' ' -f 9- ./infile
Run Code Online (Sandbox Code Playgroud)

编辑

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

  • 关于剪切的一件事是它使用特定的分隔符(默认选项卡),其中awk使用"空格".通过剪切,2个连续的制表符分隔空字段. (15认同)
  • 是的,`cut`是这项工作的正确工具. (3认同)

Asc*_*rer 51

awk '{print substr($0, index($0,$9))}'
Run Code Online (Sandbox Code Playgroud)

  • @veryhungrymike:...如果第九个之前的任何字段包含与第九个相同的值,则不起作用. (9认同)
  • 可能是因为经典句子"希望你的档案没有那个问题".在s/w工程中总共__no-no__表示:*"我们不会浪费时间,包括错误检查输入例如负值,因为'我们希望用户足够聪明,不要试用它们,崩溃我们的工具'".*哈哈!总是喜欢听到这个!(我喜欢幽默感)好吧,当白痴*存在时,开发人员有责任制作他的东西*白痴*!而不是"希望人类的好处".这是哲学家所期待的态度,而不是s/w工程师......大声笑 (6认同)
  • 如果您在日常工作中在命令行上使用 awk,这绝对是您想要的解决方案。这不是很明显吗?错误检查等在这种情况下并不重要,因为您在输入时可以在按 Enter 之前捕获此类内容(就我个人而言,我认为 awk 不应该用于其他任何用途,这就是为什么我们“有 perl、python、tcl 和大约 100 多种其他更好、更快、不那么烦人的脚本语言!)”当然,也许我给了我的软件开发人员太多的信任,他们确实需要错误检查,即使是在他们输入的内容上在飞行中(??) (3认同)
  • 这个很棒! (2认同)
  • 我并不是说不检查错误,但如果你知道你不会遇到这个问题,那么这个解决方案很好,就像我说的那样.但是,谢谢你不必要的downvote @syntaxerror.这个解决方案适用于某些人,因为(当前)19个upvotes将显示,但如果没有,那么不要将它用于您的解决方案.有很多方法可以解决OP的问题. (2认同)

小智 10

sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Run Code Online (Sandbox Code Playgroud)

而不是处理可变宽度的空白,将所有空格替换为单个空格.然后使用简单cut的感兴趣的字段.

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


bob*_*ogo 8

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

perl -lane 'print "@F[8..$#F]"'
Run Code Online (Sandbox Code Playgroud)

Timtowtdi当然适用.

  • 当然,"更好"是旁观者的眼睛. (7认同)
  • 投反对票是因为问题询问如何在 awk 中执行此操作,而不是 perl、ruby、java、python、bash。 (2认同)

Rob*_*ila 5

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

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

定义一个函数:

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

并像这样使用它:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost   
Run Code Online (Sandbox Code Playgroud)

输出保留所有内容,包括尾随空格 对于 N=0,它按原样返回整行,对于 n>NF 返回空字符串