打印所有,但前三列 [英] Print all but the first three columns
问题描述
太麻烦了:
的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:
Example of answer adding extra leading spaces:
$ echo '1 2 3 4 5 6 7' | awk '{$1=$2=$3=""}1' | tr ' ' '-' ---4-5-6-7
Example of 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-------
这篇关于打印所有,但前三列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!