太麻烦了:

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

最佳答案

不添加额外的前导或尾随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使用三元运算符提出了一种优雅的改进,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提供了一种保留字段之间原始空格的解决方案:
$ echo '1   2 3 4   5    6 7' |
  awk '{ sub(/([^ ]+ +){3}/,"") }1' |
  tr ' ' '-'
4---5----6-7

BinaryZebra还提供了两个很棒的解决方案:
(这些解决方案甚至保留原始字符串的尾随空格)
$ 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->."

larsr在注释中给出的解决方案几乎是正确的:
$ 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

这是larsr解决方案的固定和参数化版本:
$ 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

2013年9月之前的所有其他答案都不错,但要添加额外的空格:
  • answer adding extra leading spaces的示例:
    $ echo '1 2 3 4 5 6 7' |
      awk '{$1=$2=$3=""}1' |
      tr  ' ' '-'
    ---4-5-6-7
    
  • answer adding extra trailing space的示例
    $ echo '1 2 3 4 5 6 7' |
      awk '{for(i=4;i<=13;i++)printf "%s ",$i;printf "\n"}' |
      tr ' ' '-'
    4-5-6-7-------
    
  • 08-26 23:00
    查看更多