打印所有,但前三列 [英] Print all but the first three columns

查看:286
本文介绍了打印所有,但前三列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

太麻烦了:

 的awk'{打印,$ 4$ 5$ 6$ 7$ 8$ 9$ 10$ 11$ 12$ 13}'的东西


解决方案

这不会增加额外领先的溶液或尾随空格

 的awk'{为(I = 4; I< NF;我++)printf的%S,$ OFS我;如果(NF)的printf%S,$ NF; ORS的printf}###例###
$回声1 2 3 4 5 6 7|
  AWK'{为(I = 4; I< NF;我++)printf的%S,$ OFS我;如果(NF)的printf%S,$ NF; printf的ORS}'|
  TR''' - '
4-5-6-7

Sudo_O 提出使用三元运算符的 NF ORS优雅的改进:OFS

  $回声1 2 3 4 5 6 7|
  AWK'{为(I = 4; I< = NF;我++)printf的%S,$ I(我== NF ORS:OFS)}'|
  TR''' - '
4-5-6-7

EdMorton 给出了解决方案preserving字段之间原有的空格:

  $回声1 2 3 4 5 6 7|
  AWK'{子(/([^] ++){3} /,)} 1 |
  TR''' - '
4 --- 5 ---- 6-7

BinaryZebra 还提供了两个解决方案,真棒:结果
(这些解决方案甚至preserve尾随原始字符串空格)

  $回声-e'1 2 \\ t \\ T3 4 5 6 7 \\ T 8 \\ T'|
  AWK -vn = 3'{对于(ⅰ= 1; I&下; =正;我++){子(^ [FS] * [^FS] + [FS] +,,$ 0个);}} 1'|
  SED的/ /./g;s/\\t/->/g;s/^/\"/;s​​/$/\"/
4 ... 5 ... 6.7 .-> .8-取代。$回声-e'1 2 \\ t \\ T3 4 5 6 7 \\ T 8 \\ T'|
  AWK -v n = 3的{打印gensub([FS] *([^FS] + [FS] +){的n},,1); }'|
  SED的/ /./g;s/\\t/->/g;s/^/\"/;s​​/$/\"/
4 ... 5 ... 6.7 .-> .8-取代。

在评论由 larsr 给出的解决方案是正确的差不多:

  $回声1 2 3 4 5 6 7|
  AWK'{为(i = 3; I< = NF;我++)$(I-2)= $ I; NF = NF-2;打印$ 0}'| TR''' - '
3-4-5-6-7

这是 larsr 解决方案的固定和参数化版本:

  $回声1 2 3 4 5 6 7|
  AWK'{为(I = N; I< = NF;我++)$(I-(N-1))= $ I; NF = NF-κB(N-1);打印$ 0}'N = 4 | TR''' - '
4-5-6-7

九月在2013年之前所有其他的答案是好的,但添加额外的空格:


  • 例额外前导空格:

      $回声1 2 3 4 5 6 7|
      AWK'{$ 1 = $ 2 = $ 3 =} 1'|
      TR''' - '
    --- 4-5-6-7


  • 答案示例添加额外的尾随空格

      $回声1 2 3 4 5 6 7|
      AWK'{为(I = 4; I< = 13;我++)printf的%S,$ I; printf的\\ n}'|
      TR''' - '
    4-5-6-7 -------


Too cumbersome:

awk '{print " "$4" "$5" "$6" "$7" "$8" "$9" "$10" "$11" "$12" "$13}' things

解决方案

A solution that does not add extra leading or trailing whitespace:

awk '{ for(i=4; i<NF; i++) printf "%s",$i OFS; if(NF) printf "%s",$NF; printf ORS}'

### Example ###
$ echo '1 2 3 4 5 6 7' |
  awk '{for(i=4;i<NF;i++)printf"%s",$i OFS;if(NF)printf"%s",$NF;printf ORS}' |
  tr ' ' '-'
4-5-6-7

Sudo_O proposes an elegant improvement using the ternary operator NF?ORS:OFS

$ echo '1 2 3 4 5 6 7' |
  awk '{ for(i=4; i<=NF; i++) printf "%s",$i (i==NF?ORS:OFS) }' |
  tr ' ' '-'
4-5-6-7

EdMorton gives a solution preserving original whitespaces between fields:

$ echo '1   2 3 4   5    6 7' |
  awk '{ sub(/([^ ]+ +){3}/,"") }1' |
  tr ' ' '-'
4---5----6-7

BinaryZebra also provides two awesome solutions:
(these solutions even preserve trailing spaces from original string)

$ echo -e ' 1   2\t \t3     4   5   6 7 \t 8\t ' |
  awk -v n=3 '{ for ( i=1; i<=n; i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 ' |
  sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'
"4...5...6.7.->.8->."

$ echo -e ' 1   2\t \t3     4   5   6 7 \t 8\t ' |
  awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }' |
  sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'
"4...5...6.7.->.8->."

The solution given by larsr in the comments is almost correct:

$ echo '1 2 3 4 5 6 7' | 
  awk '{for (i=3;i<=NF;i++) $(i-2)=$i; NF=NF-2; print $0}' | tr  ' ' '-'
3-4-5-6-7

This is the fixed and parametrized version of larsr solution:

$ echo '1 2 3 4 5 6 7' | 
  awk '{for(i=n;i<=NF;i++)$(i-(n-1))=$i;NF=NF-(n-1);print $0}' n=4 | tr ' ' '-'
4-5-6-7

All other answers before Sep-2013 are nice but add extra spaces:

这篇关于打印所有,但前三列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆